Pregunta

Tengo una aplicación que está tratando de utilizar la anotación @EJB para inyectar referencias remotas a los EJB en mi archivo ejb.jar. Estoy consiguiendo resultados inconsistentes. En un caso, tengo un oyente en web.xml que es llamada y al parecer tiene el EJB inyecta correctamente, ya que puedo ver que la conexión a la EJB y llamar a métodos en él. En otra clase (una acción struts2) consigo NPE cuando se intenta acceder a la referencia EJB. Por lo que yo puedo decir, son las llamadas idénticas, en las clases de Java que viven en el mismo archivo .war.

Como en torno al trabajo, he añadido el código en el constructor para buscar los EJB por sus nombres JNDI globales, y funciona bien. No puedo entender por qué se trabaja @EJB y no otro.

¿Fue útil?

Solución

¿Cómo se inyecta EJB en Struts 2 acciones? ¿Está utilizando CDI? ¿Está utilizando el Struts2 CDI plug-in ?

Actualizar: Los objetos El problema es que el contenedor es no crear los puntales, puntales es, por lo que el contenedor no tienen la oportunidad de inyectar nada. Vas a tener que utilizar el mencionado plug-in para CDI para permitir la inyección en sus acciones.

Si quieres darle una oportunidad, obtener Struts 2 fuentes:

svn co http://svn.apache.org/repos/asf/struts/struts2/trunk/ struts2

A continuación, cd en el directorio struts2 y ejecutar el siguiente comando (esto va a compilar los módulos necesarios para el struts-cdi-plugin)

mvn install -pl plugins -am

A continuación, obtener las fuentes de la cdi-plugin:

svn co https://svn.apache.org/repos/asf/struts/sandbox/trunk/struts2-cdi-plugin/

y compilarlo:

mvn install

Ahora, con las siguientes dependencias en mi pom.xml:

<dependency>
    <groupId>org.apache.struts</groupId>
    <artifactId>struts2-core</artifactId>
    <version>2.2.0-SNAPSHOT</version>
</dependency>
<dependency>
    <groupId>org.apache.struts</groupId>
    <artifactId>struts2-cdi-plugin</artifactId>
    <version>2.2.0-SNAPSHOT</version>
</dependency>
<dependency>
  <groupId>javassist</groupId>
  <artifactId>javassist</artifactId>
  <version>3.8.0.GA</version>
</dependency>

Yo era capaz de conseguir un EJB se inyecta en una acción:

public class HelloWorld extends ActionSupport {

    @Inject
    HelloEJB helloEjb;

    @Override
    public String execute() throws Exception {
        setMessage(helloEjb.getMessage());
        return SUCCESS;
    }

    private String message;

    public void setMessage(String message) {
        this.message = message;
    }

    public String getMessage() {
        return message;
    }

}

https: //svn.apache .org / repos / asf / puntales / caja de arena / trunk / struts2-cdi-ejemplo / para un ejemplo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top