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 :)