2012-08-31 16 views
5

Buona giornata! Sono nuovo arrivato nel JavaEE 6. Ho provato a creare un progetto iniziato con l'uso del seguente tutorial: Creating and Running an Application Client on the GlassFish Server. Ho creato quattro progetti passo dopo passo: JavaSE lib per archiviare un'interfaccia remota EJB, un modulo EJB e altrimenti come descritto nel tutorial.Ciao mondo! con Remote Session Session Bean

La mia piattaforma:

  • Distributore ID: Ubuntu Descrizione: Ubuntu 10.10 di uscita: 10.10 Codename: maverick
  • jdk1.6.0_26
  • Netbean7.2 (Build 201207171143)
  • GlassFish Server 3+

La mia interfaccia remota

package ejb.started; 
    //  
    import javax.ejb.Remote; 
    // 
    @Remote 
    public interface StartedSessionBeanRemote { 

     String getHelloWorld(); 

    } 

sua attuazione:

package ejb.started; 
// 
import javax.ejb.Stateless; 
// 
@Stateless(name="StartedSessionBeanRemote") 
public class StartedSessionBean implements StartedSessionBeanRemote { 

    @Override 
    public String getHelloWorld() { 
     return ("Hello world, EJB!"); 
    } 

} 

E il codice del client:

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()); 
    } 
} 

Quando provo a fare funzionare il proj Remote Client, ricevo il seguente output:

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) 

Non posso presumere quale sia il problema. Ho costruito gli stessi progetti sul mio secondo PC e tutti funzionano con successo. Quella ha la stessa piattaforma software.

+0

ho scoperto che esercitazione viziata. Suggeriscono di creare un'applicazione Enterprise. Se, invece, si crea un modulo EJB, dovrebbe funzionare come pubblicizzato. Vedi: http://stackoverflow.com/questions/25828542/how-to-create-a-remote-session-ejb-from-a-client/25829907#25829907 – Thufir

risposta

4

quando si scrive:

@EJB 
private static StartedSessionBeanRemote startedSessionBean; 

vostro client tenta di eseguire un injection di quella EJB. Nel tuo caso ovviamente non ha avuto successo:

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

Puoi aiutare te stesso utilizzando il costrutto mappedName. Riscrivere queste righe del codice nel modo seguente:

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

e

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

Infine, assicurarsi che il bean viene distribuito prima che il client, perché senza il client EJB non può iniettare :)

+0

Sì, ho dimenticato di distribuire l'app client e l'impresa app.) L'ho corretto e tutto ha cominciato a funzionare. Grazie! – ilya8891

+0

Ma ora sta funzionando per me. Yar ..... Ho provato molti esempi ma non ho iniettato 'Remote Ejb'. Ho visitato https://netbeans.org/kb/docs/javaee/entappclient.html # Exercise_32 example – Yubaraj

4

Credo che non sia possibile accedere a un EJB utilizzando l'annotazione @EJB da un metodo principale poiché tale metodo non è gestito dal server. Invece, dovresti usare JNDI.

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

+0

Grazie mille. Come ho scritto, sono iscritto. Quindi sarò grato per tutto il materiale utile relativo a JavaEE e JavaBeans nel caso particolare. – ilya8891

+1

@carcaret: ciò è vero in caso di applicazione Java autonoma, ma non nel caso di Enterprise Application Client, come menzionato nella domanda di ilya8891. Normalmente puoi usare l'iniezione qui. –

+0

dead link ...... – Thufir