Question

J'ai une application qui tente d'utiliser l'annotation @EJB pour injecter des références à distance dans mon dossier EJBs de ejb.jar. Je reçois des résultats incohérents. Dans un cas, j'ai un auditeur dans web.xml qui est appelé et a apparemment l'EJB injecté correctement, puisque je peux le voir se connecter à l'EJB et appeler des méthodes sur elle. Dans une autre classe (une action struts2) Je reçois NPE quand il tente d'accéder à la référence EJB. Pour autant que je peux dire, ils sont des appels identiques, dans les classes Java qui vivent dans le même fichier .war.

En tant que travail autour, j'ai ajouté le code dans le constructeur de rechercher les noms EJB par leurs JNDI globales, et il fonctionne très bien. Je ne peux pas comprendre pourquoi on travaille de @EJB et pas un autre.

Était-ce utile?

La solution

Comment trouvez-vous injectez dans Struts 2 EJBs actions? Utilisez-vous CDI? Utilisez-vous le Struts2 plug-in CDI ?

Mise à jour: Le problème est que le conteneur ne crée pas les objets Struts, Struts est, de sorte que le récipient ne soit pas l'occasion de quoi que ce soit inject. Vous devez utiliser le CDI pour permettre l'injection dans vos actions.

Si vous voulez essayer, obtenir Struts 2 sources:

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

Ensuite cd dans le répertoire struts2 et exécutez la commande suivante (ce compilera les modules nécessaires à l'struts-cdi-plugin)

mvn install -pl plugins -am

Ensuite, obtenir les sources du cdi-plugin:

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

Et le compiler:

mvn install

Maintenant, avec les dépendances suivantes dans mon 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>

J'ai été en mesure d'obtenir un EJB injecté dans une action:

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;
    }

}

Voir https: //svn.apache .org / Repos / asf / entretoises / bac à sable / tronc / struts2-cdi-exemple / pour un exemple.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top