2012-08-31 16 views
5

अच्छा दिन के साथ! मैं जावाईई 6 में नवागंतुक हूं। मैंने निम्नलिखित ट्यूटोरियल के उपयोग के साथ एक प्रारंभिक प्रोजेक्ट बनाने की कोशिश की: Creating and Running an Application Client on the GlassFish Server। मैंने चार परियोजनाओं को चरण-दर-चरण बनाया: जावा ईएसबी रिमोट इंटरफेस को स्टोर करने के लिए जावाएसई लिब, एक ईजेबी मॉड्यूल और अन्यथा ट्यूटोरियल में वर्णित है।हैलो वर्ल्ड! रिमोट स्टेटलेस सत्र बीन

मेरे मंच:

  • वितरक ID: उबंटू विवरण: उबंटू 10.10 रिलीज: 10.10 कोडनाम: आवारा
  • jdk1.6.0_26
  • Netbean7.2 (बिल्ड 201207171143)
  • ग्लासफिश सर्वर 3+

मेरा रिमोट इंटरफ़ेस

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

     String getHelloWorld(); 

    } 

इसके कार्यान्वयन:

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

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

} 

और ग्राहक कोड:

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

जब मैं रिमोट क्लाइंट proj चलाने का प्रयास, मैं निम्नलिखित उत्पादन प्राप्त करते हैं:

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) 

मैं यह नहीं समझ सकता कि वह समस्या क्या है। मैंने अपने दूसरे पीसी पर एक ही परियोजनाएं बनाई और सभी काम सफलतापूर्वक। उसमें एक ही सॉफ्टवेयर मंच है।

+0

मैंने पाया कि ट्यूटोरियल त्रुटिपूर्ण है। वे एक एंटरप्राइज़ एप्लिकेशन बनाने का सुझाव देते हैं। यदि, इसके बजाय, आप केवल एक ईजेबी मॉड्यूल बनाते हैं तो इसे विज्ञापन के रूप में काम करना चाहिए। देखें: http://stackoverflow.com/questions/25828542/how-to-create-a-remote-session-ejb-from-a-client/25829907#25829907 – Thufir

उत्तर

4

जब आप लिखें:

@EJB 
private static StartedSessionBeanRemote startedSessionBean; 

अपने ग्राहक कि EJB के injection प्रदर्शन करने के लिए कोशिश करता है। आपके मामले में यह स्पष्ट रूप से सफल नहीं था:

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

मैप किए गए नाम निर्माण का उपयोग करके आप स्वयं की मदद कर सकते हैं। निम्नलिखित तरीके से अपने कोड की इन पंक्तियों को फिर से लिखें:

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

और

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

अंत में, सुनिश्चित करें कि आपके EJB, ग्राहक से पहले तैनात किया गया है क्योंकि EJB ग्राहक बिना यह इंजेक्षन नहीं कर सकते हैं :)

+0

हां, मैं ऐप क्लाइंट और एंटरप्राइज़ को तैनात करना भूल गया ऐप।) मैंने इसे सही किया और सभी ने काम करना शुरू कर दिया। धन्यवाद! – ilya8891

+0

लेकिन अब यह मेरे लिए काम कर रहा है। यार ..... मैंने कई उदाहरणों की कोशिश की लेकिन 'रिमोट ईजेबी' इंजेक्शन नहीं दी। मैं https://netbeans.org/kb/docs/javaee/entappclient के माध्यम से चला गया।एचटीएमएल # Exercise_32 उदाहरण – Yubaraj

4

मेरा मानना ​​है कि आप एक मुख्य विधि से @EJB एनोटेशन का उपयोग करके ईजेबी तक नहीं पहुंच सकते हैं क्योंकि उस विधि को सर्वर द्वारा प्रबंधित नहीं किया जाता है। इसके बजाय, आपको जेएनडीआई का उपयोग करना चाहिए।

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

+0

बहुत बहुत धन्यवाद। जैसा कि मैंने लिखा, मैं अंदरूनी हूं। तो मैं विशेष मामले में जावाईई और जावाबीन से संबंधित सभी सहायक सामग्री के लिए धन्यवादयोग्य होगा। – ilya8891

+1

@carcaret: स्टैंडअलोन जावा एप्लिकेशन के मामले में यह सच है, लेकिन एंटरप्राइज़ एप्लिकेशन क्लाइंट के मामले में नहीं, जैसा कि ilya8891 के प्रश्न में उल्लिखित है। आप आमतौर पर यहां इंजेक्शन का उपयोग कर सकते हैं। –

+0

मृत लिंक ...... – Thufir

संबंधित मुद्दे