java ee - EJB 3.1: ¿Permite la inyección de frijoles en recursos no administrados por el contenedor?
java-ee ejb-3.0 (2)
Ningún contenedor podrá inyectar nada en un objeto no administrado.
Para poder inyectar en un objeto, el contenedor necesita administrar el ciclo de vida del objeto o, al menos, participar en la gestión de su ciclo de vida, de modo que pueda tomar el objeto en una etapa temprana para realizar la inyección. Si un objeto se crea y utiliza sin exponerse nunca al contenedor (como supongo que son los granos de acción de Struts), entonces el contenedor nunca tiene la posibilidad de inyectar nada en él. El contenedor no es mágico; no puede detectar objetos creados en toda la JVM y hacerles cosas.
La respuesta de Mikko tiene una buena lista de los tipos de objetos que serán inyectables. A menos que los beans de acción sean uno de esos, no hay dados, me temo.
Ahora, después de haber dicho todo eso, hay una luz al final del túnel: puede ser posible escribir una extensión para Struts que maneja la inyección. Las inyecciones de @EJB y @Resource se corresponden de manera bastante directa con búsquedas JNDI particulares; una extensión podría buscar de forma reflexiva los campos anotados, luego realizar las búsquedas JNDI correspondientes e inyectar los resultados. La inyección de CDI es aún más fácil, porque tiene una API específicamente destinada a escribir extensiones. Para ver un ejemplo de cómo hacer todo esto, eche un vistazo al enriquecedor de inyección de Stripes , que agrega soporte para @EJB, @Resource e @Inject al marco web de Stripes .
Estoy usando JBoss 6.1 y no es totalmente compatible con EJB 3.1. Por el momento, no puedo inyectar un EJB en mis clases de acción Struts (o en ninguna clase administrada por el contenedor EE EE) a través de @EJB
, pero ¿será posible cuando la especificación EJB 3.1 esté completamente implementada?
Si no, ¿será demasiado inviable tenerlo por motivos de rendimiento en el futuro previsible?
No se espera que lo tenga con la implementación completa de la especificación. Esto se explica en la especificación Java EE v6 (EJB 3.1 es una especie de subespecificación de una parte de Java EE 6). Los siguientes componentes son capaces de inyectar (especificación, clases de componentes):
- Servlet: servlets, filtros de servlets, oyentes de eventos
- JSP: controladores de etiquetas, detectores de eventos de biblioteca de etiquetas
- JSF: frijoles gestionados de ámbito
- JAX-WS: puntos finales de servicio, controladores
- EJB: frijoles, interceptores
- Granos gestionados: frijoles gestionados
- CDI: frijoles administrados estilo CDI, decoradores
- Plataforma Java EE: clase principal (estática), controlador de devolución de llamada de inicio de sesión
Explicado con más profundidad en la especificación mencionada, páginas 68-71.