2010-03-01 11 views
6

En Weblogic 10.3, ¿cómo inyecté un EJB remoto de un EAR en un bean sin estado de otro, ambos EAR se implementaron en el mismo contenedor? Idealmente, me gustaría hacer todo lo posible con anotaciones.¿Cómo puedo llamar a un EJB remoto en un EAR de otro?

Así que supongamos que tengo la siguiente interfaz:

public interface HelloService { 
    public String hello(); 
} 

implementado por la siguiente EJB:

@Stateless 
@Remote 
public class HelloServiceBean implements HelloService { 
    public String hello() { 
     return "hello"; 
    } 
} 

Supongamos que están empaquetados y desplegados en server.ear. Ahora en client.ear, Tengo el siguiente:

@Stateless 
public class HelloClientBean { 
    @EJB 
    HelloService helloService; 

// other methods... 
} 

¿Qué necesito para agregar de manera que se da cuenta de Weblogic el cableado correctamente entre HelloClientBean en client.ear y HelloServiceBean en server.ear? Consejos para documentaciones oficiales y/o libros de bienvenida.

+0

Bache desvergonzado. Todo lo que he descubierto hasta ahora es que Weblogic vinculará un bean sin estado anotado con @Stateless (mappedName = "foo") a "foo # fully.qualified.interface.name" en JNDI. Pero, ¿cómo debería anotar mi campo 'helloService' en' HelloClientBean'? – lindelof

Respuesta

4

La solución más fácil que he encontrado hasta ahora es la siguiente.

En primer lugar, realizar anotaciones en el bean sin estado con un atributo mappedName:

@Stateless(mappedName="HelloService") 
@Remote 
public class HelloServiceBean implements HelloService { 
    public String hello() { 
     return "hello"; 
    } 
} 

Según http://forums.oracle.com/forums/thread.jspa?threadID=800314&tstart=1, Weblogic nunca crear una entrada JNDI para un EJB menos que un nombre JNDI se da como el atributo mappedName (o en el descriptor de despliegue, o en una anotación propietaria).

Siguiente, ahora se puede anotar su campo cliente con @EJB con un atributo mappedName, que debe ser el mismo que el atributo en el servidor de frijol. (Estoy sinceramente sorprendido por este NameNotFoundException when calling a EJB in Weblogic 10.3 sugiere que debería ser capaz de utilizar la sintaxis mappedName#interfaceName, pero en mis pruebas esto no funciona..):

@Stateless 
public class HelloClientBean { 
    @EJB(mappedName="HelloService") 
    HelloService helloService; 

// other methods... 
} 

Esto ahora funciona, siempre y cuando ambas orejas son desplegado en el mismo contenedor. A continuación, intentaré descubrir la sintaxis correcta cuando se implementen en máquinas diferentes.

+0

El uso de nombres es útilI y funciona bien, pero no se adapta para la personalización. Cualquier cambio de configuración afectará su código. La configuración EJB jar xml o alguna inyección de configuración/proxificación en el inicio a través de CDI haría lo mismo, pero también le permite parametrizarlo, aumentando la capacidad de mantenimiento y despliegue. – kij

+0

Los EJB que usan nombres asignados pueden no ser portátiles. –

Cuestiones relacionadas