XML y yo no nos llevamos bien... por eso me gustó tanto que EJB 3 habilitara la configuración mediante anotaciones. Pero, como ya sabe, a Sun le encanta poner preguntas de las cosas feas de la tecnología en el examen (i.e Threads, Generics, Filters), así que debido a eso vamos a hacer un repaso práctico de como declarar referencias EJB en el DD.
Creo que este ejemplillo se explica por si solo:
<enterprise-beans>
<session>
<ejb-name>EmployeeService</ejb-name>
<ejb-class>com.wombat.empl.EmployeeServiceBean</ejb-class>
<ejb-ref>
<description>Esta es una referencia a un EJB 2.1 entity bean</description>
<ejb-ref-name>ejb/Emplrecord</ejb-ref-name>
<ejb-ref-type>Entity</ejb-ref-type>
<home>com.wombat.empl.EmployeeRecordHome</home>
<remote>com.wombat.empl.EmployeeRecord</remote>
</ejb-ref>
<ejb-local-ref>
<description>Esta es una referencia a la interfaz de negocio local de un session bean EJB 3.0 </description>
<ejb-ref-name>ejb/Payroll</ejb-ref-name>
<local>com.aardvark.payroll.Payroll</local>
</ejb-local-ref>
<ejb-local-ref>
<description>Otra referencia a una interfaz de negocio local de un session bean EJB 3.0</description>
<ejb-ref-name>ejb/PensionPlan</ejb-ref-name>
<local>com.wombat.empl.PensionPlan</local>
</ejb-local-ref>
</session>
</enterprise-beans>
Aunque... siempre son necesarias cierta aclaraciones:
- Para declarar referencias EJB, se utilizan los elementos ejb-ref y ejb-local-ref. Usamos ejb-ref para acceder al EJB mediante su interfaz de negocio remota, o remote home; mientras ejb-local-ref es usada para acceder mediante la interfaz de negocio local o local home
- El elemento ejb-ref-name es obligatorio, y su valor es la entrada en el entorno EJB usada en el código EJB
- El elemento ejb-ref-type es opcional, y sirve para indicarnos el tipo de EJB esperado: Entity o Session
- El elemento local de ejb-local-ref, se refiere a la clase/ tipo de la interfaz de negocio
- Recordando siempre que las referencias EJB no son accessibles por otros EJB's en tiempo de ejecución. Cada EJB debe definir sus propias referencias EJB 's porque estas no se comparten.
<enterprise-beans>
<session>
<ejb-name>EmployeeService</ejb-name>
<ejb-class>com.wombat.empl.EmployeeServiceBean</ejb-class>
...
<ejb-ref>
<ejb-ref-name>ejb/EmplRecord</ejb-ref-name>
<ejb-ref-type>Entity</ejb-ref-type>
<home>com.wombat.empl.EmployeeRecordHome</home>
<remote>com.wombat.empl.EmployeeRecord</remote>
<ejb-link>EmployeeRecord</ejb-link>
</ejb-ref>
</session>
<entity>
<ejb-name>EmployeeRecord</ejb-name>
<home>com.wombat.empl.EmployeeRecordHome</home>
<remote>com.wombat.empl.EmployeeRecord</remote>
...
</entity>
...
</enterprise-beans>
Recordemos que una referencia es simplemente una referencia. Simplemente nos dice "aquí debería haver un EJB, y yo debería poder usarlo", lo cuál, en tiempo de ejecución, no es suficiente. Para suerte nuestra, nuestro amigo el ensamblador de aplicaciones tiene entre sus funciones el asignarle a la referencia EJB un EJB objetivo, de modo que ahora sí sea utilizable desde el EJB que contiene la referencia. Y para eso, utiliza el elemento ejb-link del descriptor de despliegue.
Como vemos en el ejemplo de arriba, se utiliza ejb-link dento de ejb-ref o ejb-local-ref para hacer referencia a un EJB en concreto. El valor del elemento ejb-link debe coincidir con el elemento name del enterprise bean objetivo.
Tenemos que seguir con esto del entorno EJB, pero ya será en otra ocasión. Hasta otra..!!
2 comments
Che amigo!. Buen blog, hay pocos con info para SCWCD en español.
ReplySaludos desde oeste del GBA
El ponja
Hay algo que no logro entender, si el provedor del bean nos dice con ejb-ref que dentro del codigo uso un ejb y pues si es asi seguramente lo tuvo que usar sino para que lo dclaro en el código ?? y por lo tanto debe de saber que metodos o de que tipo es, es decir el ejb objetivo o concreto, entonces por que se deja este trabajo a el ensamblador ? cuando el dice, ok, tu ejb-ref-name es una especie de ID dentro de tu código, pero el EJB real es este y se le da un valor al ejb-link, pero entonces el provedor con que diablos trabajo en su momento ??
ReplyPublicar un comentario