문제

EJB가 다음과 같이 정의되어 있습니다.

package com.foo;
@Stateless (mappedName="HelloWorld")
public class HelloWorldBean implements HelloWorld, HelloWorldLocal
....

Weblogic (WL)에 배치되면 Mybean이라는 이름이됩니다. 이것이 중요한지 확실하지 않습니다.

이 코드로 Bean을 호출하려고합니다.

Hashtable ht = new Hashtable();
ht.put(Context.INITIAL_CONTEXT_FACTORY,"weblogic.jndi.WLInitialContextFactory");
ht.put(Context.PROVIDER_URL, "t3://localhost:7001");
ic = new InitialContext(ht);
tp = (HelloWorld) ic.lookup("HelloWorld#com.foo.HelloWorldBean");

누구든지 내가 왜 다음과 같은 오류를 받는지 아는 사람이 있습니까?

javax.naming.NameNotFoundException: While trying to lookup 'HelloWorld#com.foo.HelloWorldBean' didn't find subcontext 'HelloWorld#com'.
 Resolved '' [Root exception is javax.naming.NameNotFoundException: While trying
 to lookup 'HelloWorld#com.foo.HelloWorldBean' didn't find
 subcontext 'HelloWorld#com'. Resolved '']; remaining name 'HelloWorld#com/foo/HelloWorldBean'
도움이 되었습니까?

해결책

여러 원격 비즈니스 인터페이스가있는 세션 Bean의 원격 인터페이스를 조회하려면 (예 :com.acme.FooBusiness1, com.acme.FooBusiness2), 대상 EJB의 글로벌 JNDI 이름 ( mappedName() 안에 @Stateless) 및 "#"로 분리 된 특정 원격 비즈니스 인터페이스 :

InitialContext ic = new InitialContext();
FooBusiness1 bean1 = (FooBusiness1) ic.lookup("FooEJB#com.acme.FooBusiness1");
FooBusiness2 bean2 = (FooBusiness2) ic.lookup("FooEJB#com.acme.FooBusiness2");

원격 비즈니스 인터페이스가 하나만있는 Bean의 일반적인 경우이 완전히 자격이있는이 양식은 필요하지 않습니다. 이 경우 Bean의 JNDI 이름은 직접 사용할 수 있습니다.

FooBusiness bean = (FooBusiness) ic.lookup("FooEJB");

그것은 이론적 인 부분이었습니다. 이제 연습. 귀하의 경우, 내가 볼 수있는 것에서, 당신은 Weblogic에서 EJB에 액세스하고 있으므로 오히려 No-Arg를 사용하고 싶습니다. InitialContext() 생성자 (및 사용 a jndi.properties 다른 환경의 구성 파일) 그러나 이것은 단지 부수적 일뿐입니다. 그런 다음, 당신은 찾아야합니다 com.foo.HelloWorld, 원격 인터페이스는 아닙니다 com.foo.HelloWorldBean, 구현 :

InitialContext ic = new InitialContext();
(HelloWorld) ic.lookup("HelloWorld#com.foo.HelloWorld");

콩이 원격 비즈니스 인터페이스가 하나만 있으면 작동해야합니다.

(HelloWorld) ic.lookup("HelloWorld");
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top