iniezione bean in webapp Glassfish
-
30-09-2019 - |
Domanda
Ho un app che sta cercando di usare @EJB annotazioni per iniettare riferimenti remoti a EJB nel mio file ejb.jar. Sto ottenendo risultati inconsistenti. In un caso, ho un ascoltatore in web.xml che viene chiamato e apparentemente ha l'EJB iniettato correttamente, dato che posso vedere la connessione a EJB e chiamare i metodi su di esso. In un'altra classe (un'azione Struts2) ottengo NPE quando si tenta di accedere al riferimento EJB. Per quanto posso dire, sono chiamate identici, in classi Java che vivono nello stesso file .war.
Come attorno al lavoro, ho aggiunto il codice nel costruttore di ricercare gli EJB con i loro nomi JNDI globale, e funziona bene. Io proprio non riesco a capire il motivo per cui si lavora @EJB e non un altro.
Soluzione
Come si inietti EJB in Struts 2 azioni? Si sta utilizzando CDI? Si sta utilizzando il Struts2 CDI plug-in ?
Aggiornamento: Il problema è che il contenitore non è la creazione della Struts oggetti, Struts è, in modo che il contenitore non ottiene la possibilità di iniettare qualsiasi cosa. Dovrete usare il citato plug-in per CDI per consentire l'iniezione nelle vostre azioni.
Se si vuole fare un tentativo, ottenere Struts 2 fonti:
svn co http://svn.apache.org/repos/asf/struts/struts2/trunk/ struts2
cd
Poi nella directory struts2
ed eseguire il seguente comando (questo compilerà i moduli necessari per la struts-cdi-plugin
)
mvn install -pl plugins -am
si metterà subito le sorgenti del cdi-plugin:
svn co https://svn.apache.org/repos/asf/struts/sandbox/trunk/struts2-cdi-plugin/
e compilarlo:
mvn install
Ora, con le seguenti dipendenze nel mio 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>
sono stato in grado di ottenere un EJB iniettato in un'azione:
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 / puntoni / sandbox / trunk / Struts2-cdi-example / per un esempio.