7

У меня есть EJB, определенный как это:NameNotFoundException при вызове EJB в Weblogic 10,3

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

ли ваш боба есть несколько удаленных бизнес-интерфейсов? –

+0

Да, интерфейс HelloWorld. Извините за хромые имена. Я пытаюсь познакомиться с EJB. – Sajee

+0

Это только одно, а не несколько :) Я все равно ответил на оба случая. –

ответ

10

для поиска удаленного интерфейса бина сеанса с несколькими удаленными бизнес-интерфейсов (например, 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, удаленный интерфейс, а не com.foo.HelloWorldBean, реализация:

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

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

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

Pascal: Я пробовал ic.lookup («HelloWorld # com.foo.HelloWorld»), и я получаю ту же ошибку, что и выше. Я пробовал ic.lookup («HelloWorld») и я получаю ту же ошибку, что и выше: javax.naming.NameNotFoundException: не удалось разрешить «HelloWorld». Решено '' [Исключение корня javax.naming.NameNotFoundException: не удалось разрешить «HelloWorld». Решено '']; 'HelloWorld' – Sajee

+0

Я развернул EJB в Weblogic и появился как myBean на странице Развертывания в Консоли администрирования WL. Однако, когда я смотрю на дерево JNDI, я не могу найти myBean или HelloWorld в любом месте этого дерева. Возможно, это ключ к разгадке? – Sajee

+0

В @Stateless, @name() является эквивалентом аннотации в ejb-jar.xml. Если не указано @Stateless name(), по умолчанию используется неквалифицированное имя класса компонента. Поэтому я не знаю, откуда происходит «myBean». Тогда да, ваш EJB определенно должен быть видимым в дереве JNDI как «HelloWorld» (имя, которое вы указали). Вы уверены, что развертывание прошло хорошо и что ваш EJB развернут? –