2012-08-31 16 views
5

¡Buen día! Soy un recién llegado al JavaEE 6. Intenté crear un proyecto iniciado con el uso del siguiente tutorial: Creating and Running an Application Client on the 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.¡Hola, mundo! con Remote Stateless Session Bean

Mi plataforma:

  • Distribuidor ID: Ubuntu Descripción: Ubuntu 10.10 versión: 10.10 Codename: maverick
  • jdk1.6.0_26
  • Netbean7.2 (Build 201207171143)
  • servidor GlassFish 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 de 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 trato de ejecutar el proj 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 suponer 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.

+0

me encontré con que tutorial defectuoso. Sugieren hacer una aplicación empresarial. Si, en cambio, solo hace un módulo EJB, debería funcionar como se anuncia. Ver: http://stackoverflow.com/questions/25828542/how-to-create-a-remote-session-ejb-from-a-client/25829907#25829907 – Thufir

Respuesta

4

Cuando se escribe:

@EJB 
private static StartedSessionBeanRemote startedSessionBean; 

su cliente intenta realizar una injection 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 la construcción mappedName. Vuelva a escribir estas líneas de su código de la siguiente manera:

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

y

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

Por último, asegúrese de que el EJB se despliega ante el cliente, ya que sin el cliente EJB no puede inyectarlo :)

+0

Sí, olvidé implementar la aplicación cliente y la empresa aplicación.) Lo corregí y todo comenzó a funcionar. ¡Gracias! – ilya8891

+0

Pero ahora está trabajando para mí. Yar ..... Probé muchos ejemplos pero no inyecté 'Remote Ejb'. Pasé por https://netbeans.org/kb/docs/javaee/entappclient.html # Exercise_32 example – Yubaraj

4

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

How do I access a Remote EJB component from a stand-alone java client?

+0

Muchas gracias. Cuando escribí, soy incomer. Así que seré agradecido por todo el material útil relacionado con JavaEE y JavaBeans en el caso particular. – ilya8891

+1

@carcaret: Eso es cierto en el caso de la aplicación Java independiente, pero no en el caso de Enterprise Application Client, como se menciona en la pregunta de ilya8891. Normalmente puede usar inyección aquí. –

+0

enlace muerto ...... – Thufir

Cuestiones relacionadas