SCBCD : Referencias EJB

(Imagen: Francisco de Goya - El tres de mayo)

Ahora nos vamos a poner un poco más "concretos" con lo del entorno EJB, y veremos un poco de inyección de referencias EJB. Puesto en otras palabras, veremos como utilizar una instancia EJB dentro de otra instancia EJB, mediante entradas en el entorno del bean.

Para inyectar una referencia EJB utilizamos la anotación @EJB en un campo o en un método setter; y esta referencia puede ser la interfaz de negocio de un Session Bean, entre otras posibilidades. Pero dejemos lo abstracto y vayamos a lo concreto:

package com.acme.example;

@Stateless
public class ExampleBean implements Example {
@EJB
ShoppingCart myCart;
...
}

Aquí, en el contexto JNDI de ExampleBean se ha agregado la entrada java:comp/env/com.acme.example.ExampleBean/myCart, que corresponde a una instancia EJB de ShoppingCart. El nombre largo y complejo es definido por el contenedor, no es que me haya puesto creativo. La instancia a la que se refiera esta referencia (disculpen la redundancia) debe ser definida por el deployer. Aquí va otra:

@EJB(
name="ejb/shopping-cart"
beanInterface=ShoppingCart.class
beanName="cart1"
description="The shopping cart for this application"
)
private ShoppingCart myCart;

Aprovechando las propiedades de la anotación, ahora el nombre de la referencia en el contexto JNDI del bean sería java:comp/env/ejb/shopping-cart; que no es tan horroroso como el nombre por defecto del contenedor. Notar que ahora se hace referencia a un bean en específico, denominado "cart1". Y para terminar el post, otro snippet donde nos ponemos más concretos todavía:

@EJB
(name="ejb/EmplRecord",
beanInterface=EmployeeRecordHome.class
)
@Stateless
public class EmployeeServiceBean implements EmployeeService{
public void changePhoneNumber(...){
Context initCtx = new InitialContext();
Object result = initCtx.lookup("java:comp/env/ejb/EmplRecord");
EmployeeRecordHome emplRecordHome = (EmployeeRecordHome) javax.rmi-PortableRemoteObject.narrow(result, EmployeeRecordHome.class);
}

Lo primero que se hace asignar una entrada en el entorno del EJB, mediante la anotación @EJB. Como no la hemos utilizado en un campo o método, no se ha realizado inyección de dependencia. Una vez que tenemos la entrada en el entorno utilizamos el API JNDI para localizar la referencia EJB a la interfaz remote home. Notar que el lookup se utiliza como parámetro java:comp/env/ejb/EmplRecord, que fue definido en el atributo name de la anotación EJB.

Y creo que eso es suficiente por este post. Mañana la seguimos.

Publicar un comentario