NameNotFoundException при вызове EJB в Weblogic 10.3 - PullRequest
7 голосов
/ 24 октября 2009

EJB определен так:

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

При развертывании в Weblogic (WL) он получает имя myBean. Я не уверен, если это важно.

Я пытаюсь вызвать компонент с таким кодом:

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'

1 Ответ

10 голосов
/ 24 октября 2009

Чтобы найти удаленный интерфейс сессионного компонента с несколькими интерфейсами Remote Business (например, com.acme.FooBusiness1, com.acme.FooBusiness2), вам нужно найти имя, полученное из комбинации глобального имени JNDI целевого ejb (mappedName() в @Stateless) и конкретный удаленный бизнес-интерфейс, разделенные знаком «#»:

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

В типичном случае, когда бин имеет только один удаленный бизнес-интерфейс, эта полностью квалифицированная форма не требуется. В этом случае имя JNDI компонента может быть использовано напрямую:

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

Это была теоретическая часть. Сейчас на практике. В вашем случае, насколько я вижу, вы обращаетесь к EJB из Weblogic, поэтому я бы предпочел использовать конструктор no-arg InitialContext() (и использовать файл конфигурации jndi.properties для других сред), но это всего лишь сторона нота. Затем вам нужно поискать com.foo.HelloWorld, Remote Interface, а не com.foo.HelloWorldBean, реализацию:

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

И если у вашего компонента есть только один Удаленный бизнес-интерфейс, это должно работать:

(HelloWorld) ic.lookup("HelloWorld");
...