tutorial para descargar application java-ee netbeans glassfish javabeans glassfish-3

java-ee - para - java ee netbeans tutorial



Hola Mundo! con Remote Beans de sesiĆ³n sin estado (2)

Creo que no se puede acceder a un EJB utilizando la anotación @EJB de un método principal porque el servidor no administra ese método. En cambio, debes usar JNDI.

¿Cómo accedo a un componente EJB remoto desde un cliente java autónomo?

¡Buen día! Soy un recién llegado al JavaEE 6. Intenté crear un proyecto iniciado con el uso del siguiente tutorial: Creación y ejecución de un cliente de aplicación en GlassFish Server . Creé cuatro proyectos paso a paso: JavaSE lib para almacenar una Interfaz remota EJB, un Módulo EJB y de lo contrario como se describe en el tutorial.

Mi plataforma:

  • Identificación del distribuidor: Ubuntu Descripción: Versión de Ubuntu 10.10: 10.10 Nombre de la marca: inconformista
  • jdk1.6.0_26
  • Netbean7.2 (Build 201207171143)
  • GlassFish Server 3+

Mi interfaz remota

package ejb.started; // import javax.ejb.Remote; // @Remote public interface StartedSessionBeanRemote { String getHelloWorld(); }

Su implementación:

package ejb.started; // import javax.ejb.Stateless; // @Stateless(name="StartedSessionBeanRemote") public class StartedSessionBean implements StartedSessionBeanRemote { @Override public String getHelloWorld() { return ("Hello world, EJB!"); } }

Y el código del cliente:

package startedentappclient; // import ejb.started.StartedSessionBeanRemote; import javax.ejb.EJB; // public class AppClientMain { @EJB private static StartedSessionBeanRemote startedSessionBean; public static void main(String[] args) { System.err.println("EJB: "+startedSessionBean.getHelloWorld()); } }

Cuando intento ejecutar el proyecto de cliente remoto, recibo el siguiente resultado:

ant -f /home/ilya/Workspace/git/workspace/StartedEntAppClient -DforceRedeploy=false run init: EJBRemoteInterface.init: Deleting: /home/ilya/Workspace/git/workspace/EJBRemoteInterface/build/built-jar.properties EJBRemoteInterface.deps-jar: Updating property file: /home/ilya/Workspace/git/workspace/EJBRemoteInterface/build/built-jar.properties EJBRemoteInterface.compile: EJBRemoteInterface.jar: deps-jar: compile: library-inclusion-in-archive: dist: pre-run-deploy: Redeploying /home/ilya/Workspace/git/workspace/StartedEntAppClient/dist/StartedEntAppClient.jar Initializing... post-run-deploy: run-deploy: Copying 1 file to /home/ilya/Workspace/git/workspace/StartedEntAppClient/dist Copying 2 files to /home/ilya/Workspace/git/workspace/StartedEntAppClient/dist/StartedEntAppClientClient Warning: /home/ilya/Workspace/git/workspace/StartedEntAppClient/dist/gfdeploy/StartedEntAppClient does not exist. com.sun.enterprise.container.common.spi.util.InjectionException: Exception attempting to inject Remote ejb-ref name=startedentappclient.AppClientMain/startedSessionBean,Remote 3.x interface =ejb.started.StartedSessionBeanRemote,ejb-link=null,lookup=,mappedName=,jndi-name=ejb.started.StartedSessionBeanRemote,refType=Session into class startedentappclient.AppClientMain: Lookup failed for ''java:comp/env/startedentappclient.AppClientMain/startedSessionBean'' in SerialContext[myEnv={java.naming.factory.initial=com.sun.enterprise.naming.impl.SerialInitContextFactory, java.naming.factory.url.pkgs=com.sun.enterprise.naming, java.naming.factory.state=com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl} at com.sun.enterprise.container.common.impl.util.InjectionManagerImpl._inject(InjectionManagerImpl.java:703) at com.sun.enterprise.container.common.impl.util.InjectionManagerImpl.inject(InjectionManagerImpl.java:470) at com.sun.enterprise.container.common.impl.util.InjectionManagerImpl.injectClass(InjectionManagerImpl.java:213) at com.sun.enterprise.container.common.impl.util.InjectionManagerImpl.injectClass(InjectionManagerImpl.java:205) at org.glassfish.appclient.client.acc.AppClientContainer$ClientMainClassSetting.getClientMainClass(AppClientContainer.java:625) at org.glassfish.appclient.client.acc.AppClientContainer.getMainMethod(AppClientContainer.java:517) at org.glassfish.appclient.client.acc.AppClientContainer.completePreparation(AppClientContainer.java:411) at org.glassfish.appclient.client.acc.AppClientContainer.prepare(AppClientContainer.java:319) at org.glassfish.appclient.client.AppClientFacade.prepareACC(AppClientFacade.java:278) at org.glassfish.appclient.client.acc.agent.AppClientContainerAgent.premain(AppClientContainerAgent.java:82) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at sun.instrument.InstrumentationImpl.loadClassAndStartAgent(InstrumentationImpl.java:323) at sun.instrument.InstrumentationImpl.loadClassAndCallPremain(InstrumentationImpl.java:338) Caused by: javax.naming.NamingException: Lookup failed for ''java:comp/env/startedentappclient.AppClientMain/startedSessionBean'' in SerialContext[myEnv={java.naming.factory.initial=com.sun.enterprise.naming.impl.SerialInitContextFactory, java.naming.factory.url.pkgs=com.sun.enterprise.naming, java.naming.factory.state=com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl} [Root exception is javax.naming.NamingException: Exception resolving Ejb for ''Remote ejb-ref name=startedentappclient.AppClientMain/startedSessionBean,Remote 3.x interface =ejb.started.StartedSessionBeanRemote,ejb-link=null,lookup=,mappedName=,jndi-name=ejb.started.StartedSessionBeanRemote,refType=Session'' . Actual (possibly internal) Remote JNDI name used for lookup is ''ejb.started.StartedSessionBeanRemote#ejb.started.StartedSessionBeanRemote'' [Root exception is javax.naming.NamingException: Lookup failed for ''ejb.started.StartedSessionBeanRemote#ejb.started.StartedSessionBeanRemote'' in SerialContext[myEnv={java.naming.factory.initial=com.sun.enterprise.naming.impl.SerialInitContextFactory, java.naming.factory.url.pkgs=com.sun.enterprise.naming, java.naming.factory.state=com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl} [Root exception is javax.naming.NameNotFoundException: ejb.started.StartedSessionBeanRemote#ejb.started.StartedSessionBeanRemote not found]]] at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:518) at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:455) at javax.naming.InitialContext.lookup(InitialContext.java:392) at com.sun.enterprise.container.common.impl.util.InjectionManagerImpl._inject(InjectionManagerImpl.java:599) ... 15 more Caused by: javax.naming.NamingException: Exception resolving Ejb for ''Remote ejb-ref name=startedentappclient.AppClientMain/startedSessionBean,Remote 3.x interface =ejb.started.StartedSessionBeanRemote,ejb-link=null,lookup=,mappedName=,jndi-name=ejb.started.StartedSessionBeanRemote,refType=Session'' . Actual (possibly internal) Remote JNDI name used for lookup is ''ejb.started.StartedSessionBeanRemote#ejb.started.StartedSessionBeanRemote'' [Root exception is javax.naming.NamingException: Lookup failed for ''ejb.started.StartedSessionBeanRemote#ejb.started.StartedSessionBeanRemote'' in SerialContext[myEnv={java.naming.factory.initial=com.sun.enterprise.naming.impl.SerialInitContextFactory, java.naming.factory.url.pkgs=com.sun.enterprise.naming, java.naming.factory.state=com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl} [Root exception is javax.naming.NameNotFoundException: ejb.started.StartedSessionBeanRemote#ejb.started.StartedSessionBeanRemote not found]] at com.sun.ejb.EjbNamingReferenceManagerImpl.resolveEjbReference(EjbNamingReferenceManagerImpl.java:191) at com.sun.enterprise.container.common.impl.ComponentEnvManagerImpl$EjbReferenceProxy.create(ComponentEnvManagerImpl.java:1109) at com.sun.enterprise.naming.impl.GlassfishNamingManagerImpl.lookup(GlassfishNamingManagerImpl.java:776) at com.sun.enterprise.naming.impl.GlassfishNamingManagerImpl.lookup(GlassfishNamingManagerImpl.java:744) at com.sun.enterprise.naming.impl.JavaURLContext.lookup(JavaURLContext.java:169) at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:498) ... 18 more Caused by: javax.naming.NamingException: Lookup failed for ''ejb.started.StartedSessionBeanRemote#ejb.started.StartedSessionBeanRemote'' in SerialContext[myEnv={java.naming.factory.initial=com.sun.enterprise.naming.impl.SerialInitContextFactory, java.naming.factory.url.pkgs=com.sun.enterprise.naming, java.naming.factory.state=com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl} [Root exception is javax.naming.NameNotFoundException: ejb.started.StartedSessionBeanRemote#ejb.started.StartedSessionBeanRemote not found] at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:518) at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:455) at javax.naming.InitialContext.lookup(InitialContext.java:392) at com.sun.ejb.EjbNamingReferenceManagerImpl.resolveEjbReference(EjbNamingReferenceManagerImpl.java:186) ... 23 more Caused by: javax.naming.NameNotFoundException: ejb.started.StartedSessionBeanRemote#ejb.started.StartedSessionBeanRemote not found at com.sun.enterprise.naming.impl.TransientContext.doLookup(TransientContext.java:248) at com.sun.enterprise.naming.impl.TransientContext.lookup(TransientContext.java:215) at com.sun.enterprise.naming.impl.SerialContextProviderImpl.lookup(SerialContextProviderImpl.java:77) at com.sun.enterprise.naming.impl.RemoteSerialContextProviderImpl.lookup(RemoteSerialContextProviderImpl.java:109) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:601) at com.sun.corba.ee.impl.presentation.rmi.ReflectiveTie.dispatchToMethod(ReflectiveTie.java:144) at com.sun.corba.ee.impl.presentation.rmi.ReflectiveTie._invoke(ReflectiveTie.java:174) at com.sun.corba.ee.impl.protocol.CorbaServerRequestDispatcherImpl.dispatchToServant(CorbaServerRequestDispatcherImpl.java:528) at com.sun.corba.ee.impl.protocol.CorbaServerRequestDispatcherImpl.dispatch(CorbaServerRequestDispatcherImpl.java:199) at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequestRequest(CorbaMessageMediatorImpl.java:1624) at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequest(CorbaMessageMediatorImpl.java:1486) at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleInput(CorbaMessageMediatorImpl.java:990) at com.sun.corba.ee.impl.protocol.giopmsgheaders.RequestMessage_1_2.callback(RequestMessage_1_2.java:214) at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequest(CorbaMessageMediatorImpl.java:742) at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.dispatch(CorbaMessageMediatorImpl.java:539) at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.doWork(CorbaMessageMediatorImpl.java:2324) at com.sun.corba.ee.impl.orbutil.threadpool.ThreadPoolImpl$WorkerThread.performWork(ThreadPoolImpl.java:497) at com.sun.corba.ee.impl.orbutil.threadpool.ThreadPoolImpl$WorkerThread.run(ThreadPoolImpl.java:540) Java Result: 1 run: BUILD SUCCESSFUL (total time: 11 seconds)

No puedo asumir cuál es ese problema. Construí los mismos proyectos en mi segunda PC y todo funciona con éxito. Ese tiene la misma plataforma de software.


Cuando escribes:

@EJB private static StartedSessionBeanRemote startedSessionBean;

su cliente intenta realizar una inyección de ese EJB. En su caso, obviamente no fue exitoso:

com.sun.enterprise.container.common.spi.util.InjectionException: Exception attempting to inject...

Puede ayudarse a sí mismo utilizando el constructo mappedName. Reescribe estas líneas de tu código de la siguiente manera:

@Stateless(mappedName="ejb/StartedSessionBeanRemote") public class StartedSessionBean implements StartedSessionBeanRemote {

y

@EJB(mappedName="ejb/StartedSessionBeanRemote") private static StartedSessionBeanRemote startedSessionBean;

Finalmente, asegúrese de que su EJB se despliegue antes que el cliente, porque sin el cliente EJB no puede inyectarlo :)