Pregunta

Tengo un EJB definido como este:

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

Cuando se implementa en Weblogic (WL), recibe el nombre myBean. No estoy seguro de si esto es importante.

Intento llamar al bean con 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");

¿Alguien sabe por qué recibo el siguiente error?

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

Solución

Para buscar una interfaz remota de un bean de sesión con múltiples interfaces de negocios remotas (por ejemplo, com.acme.FooBusiness1 , com.acme.FooBusiness2 ), debe buscar un nombre derivado de la combinación del nombre JNDI global del ejb de destino (el mappedName () en @Stateless ) y la Interfaz de negocios remota específica, separados por un " # " ;:

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

En el caso típico de un bean que solo tiene una Interfaz de Negocio Remota, no se necesita esta forma completamente calificada. En ese caso, el nombre JNDI del bean se puede usar directamente:

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

Esa era la parte teórica. Ahora la práctica. En su caso, por lo que puedo ver, está accediendo al EJB desde Weblogic, así que prefiero usar el constructor no-arg InitialContext () (y usar un jndi.properties archivo de configuración para otros entornos) pero esto es solo una nota al margen. Luego, debe buscar com.foo.HelloWorld , la Interfaz remota, no com.foo.HelloWorldBean , la implementación:

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

Y si su bean tiene solo una Interfaz de Negocio Remota, esto debería funcionar:

(HelloWorld) ic.lookup("HelloWorld");
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top