NameNotFoundException ao chamar um EJB no Weblogic 10.3
-
06-07-2019 - |
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'
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");