2012-01-31 3 views
2

메소드에 원격 액세스하는 방법 또는 내가 뭘 잘못 했습니까? 너는 나에게 말해 줄 수 있니? :JNDI를 사용하여 원격 EJB 인터페이스에 액세스 할 수 없습니다.

이 테스트 케이스를 실행 한 후에는 오류가 발생한다.

나는 작동하지만 다른 케이스에서 작동하는지 이해할 수 없습니다.

@Stateless 
public class OfferManagerBean implements OfferManager, OfferManagerLocal 

OfferManager@Remote 인터페이스이고 OfferManagerLocal@Local 인터페이스 :

여기 내 EJB이다. WebProject (war 파일)에서이 파일을 실행하면 ... (해당 속성이 없습니다)

이 모든 것을 허용하고 jUnit 테스트를 실행하면 다음과 같은 오류가 발생합니다.

javax.naming.NamingException: Lookup failed for 'java:global/project/projectEJB/OfferManagerBean' in SerialContext[myEnv={org.omg.CORBA.ORBInitialPort=3700, java.naming.factory.initial=com.sun.enterprise.naming.SerialInitContextFactory, org.omg.CORBA.ORBInitialHost=localhost, java.naming.factory.state=com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl, java.naming.factory.url.pkgs=com.sun.enterprise.naming} [Root exception is javax.naming.NameNotFoundException: OfferManagerBean 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:411) 
    at ro.project.ejb.test.OfferManagerBeanTest.commitOfferTest(OfferManagerBeanTest.java:50) 
    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 org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44) 
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15) 
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41) 
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20) 
    at org.junit.runners.BlockJUnit4ClassRunner.runNotIgnored(BlockJUnit4ClassRunner.java:79) 
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:71) 
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:49) 
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193) 
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52) 
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191) 
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42) 
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184) 
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28) 
    at org.junit.runners.ParentRunner.run(ParentRunner.java:236) 
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50) 
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197) 
Caused by: javax.naming.NameNotFoundException: OfferManagerBean 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.TransientContext.lookup(TransientContext.java:219) 
    at com.sun.enterprise.naming.impl.TransientContext.lookup(TransientContext.java:219) 
    at com.sun.enterprise.naming.impl.TransientContext.lookup(TransientContext.java:219) 
    at com.sun.enterprise.naming.impl.SerialContextProviderImpl.lookup(SerialContextProviderImpl.java:77) 
    at com.sun.enterprise.naming.impl.RemoteSerialContextProviderImpl.lookup(RemoteSerialContextProviderImpl.java:94) 
    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) 

내가 좋아하는 뭔가를 발견

ctx.lookup("java:global/project/projectEJB/OfferManagerBean!ro.project.ejb.interfaces.OfferManager"); 

을 ?? 거기에 더 나은/더 짧은 솔루션이 아닌가요? 아무도 왜이 일이 일어 났는지 말할 수 있습니까? 내가 할 경우

처럼 내 선언 :

@Stateless 
public class OfferManagerBean implements OfferManager 

모든 노력하고 있습니다. 어떻게 해결할 수 있는지 알고 계십니까?

+0

질문에 명시 적으로 대답하지는 않지만 일반적으로 클래스에 로컬 인터페이스와 원격 인터페이스를 모두 구현하면 안됩니다. 로컬 메소드는 참조로 전달되는 반면 원격 메소드는 값으로 전달됩니다. 이것을 신중하게 관리해야합니다. – Preston

답변

2

당신은 당신의 코드를 사용하여 EJB에 액세스 할 수 있습니다

OfferManager offerManager = (OfferManager) 
        ctx.lookup("java:global/project/projectEJB/OfferManagerBean"); 

는 EJB는 하나의 인터페이스를 구현에만합니다. 그러한 상황에서 어떤 인터페이스가 관심 있는지 분명합니다 (단 하나뿐이므로 여기에 마법이 없습니다).

그러나 EJB가 하나 이상의 인터페이스를 구현하는 경우 어떤 인터페이스 (보기)에서 지정해야하는지보다 JNDI를 통해 액세스 할 때 관심이 있습니까? 장에서 EJB 3.1 FR 사양의 4.4 글로벌 JNDI 액세스을 정의

따라서 당신은 전체 경로를 사용해야합니다

java:global[/<app-name>]/<module-name>/<bean-name>[!<fully-qualified-intf-name>] 

또는 사양에 정의 된 java:app 또는 java:module를 사용하여.

관련 문제