Pergunta

Eu tenho um EJB definido como este:

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

Quando é implantado para Weblogic (WL), ele recebe o nome mybean. Eu não tenho certeza se isso é importante.

Eu tento chamar o feijão com este código:

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");

Alguém sabe por que eu recebo o seguinte erro?

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'
Foi útil?

Solução

Para pesquisar uma interface remota de um bean de sessão com múltiplas interfaces de Negócios (Remote egcom.acme.FooBusiness1, com.acme.FooBusiness2), você precisa procurar um nome derivado da combinação do nome JNDI global do EJB de destino (o mappedName() em @Stateless) eo específica remoto interface de Negócios, separados por um "#":

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

No caso típico de um feijão de ter apenas um remoto interface de negócios, não é necessário esta forma totalmente qualificado. Nesse caso, o nome JNDI do bean pode ser usado diretamente:

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

Essa foi a parte teórica. Agora a prática. No seu caso, pelo que posso ver, você está acessando a EJB de Weblogic então eu prefiro usar o construtor InitialContext() no-arg (e usar um arquivo de configuração jndi.properties para outros ambientes), mas esta é apenas uma nota lateral. Então, você deve olhar para cima com.foo.HelloWorld, a interface remota, não com.foo.HelloWorldBean, a implementação:

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

E se o seu feijão tem apenas uma remota interface de negócios, isso deve funcionar:

(HelloWorld) ic.lookup("HelloWorld");
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top