Frage

Ich habe eine app, die verwenden @EJB Anmerkung versucht, Remote-Referenzen zu EJBs in meiner ejb.jar Datei zu injizieren. Ich erhalte widersprüchliche Ergebnisse. In einem Fall habe ich einen Zuhörer in web.xml, die offenbar und die EJB korrekt injiziert hat aufgerufen werden, da ich es eine Verbindung mit dem EJB und Aufrufen von Methoden auf sie sehen kann. In einer anderen Klasse (eine struts2 Aktion) bekomme ich NPE, wenn es die EJB-Referenz zuzugreifen versucht. Soweit ich sagen kann, sie sind identisch Anrufen, in Java-Klassen, die in der gleichen WAR-Datei zu leben.

Als eine Arbeit um, fügte ich Code im Konstruktor der EJBs Nachschlag durch ihren globalen JNDI-Namen, und es funktioniert gut. Ich kann einfach nicht verstehen, warum man @EJB Werke und nicht die anderen.

War es hilfreich?

Lösung

Wie wollen Sie inject EJBs in Struts 2 Aktionen? Sind Sie mit CDI? Sind Sie mit der Struts2 CDI-Plugin ?

Update: Das Problem ist, dass der Behälter nicht schafft die Struts-Objekte, Struts ist, so dass der Behälter nicht bekommt die Möglichkeit, einzuspritzen nichts. Sie werden die erwähnten Plugin verwenden CDI Injektion in Ihren Aktionen zu ermöglichen.

Wenn Sie wollen, dass es einen Versuch geben, erhalten Struts 2 Quellen:

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

Dann cd in das struts2 Verzeichnis und führen Sie den folgenden Befehl ein (dies wird die benötigte Module für die struts-cdi-plugin kompiliert)

mvn install -pl plugins -am

Dann nehmen Sie die Quellen der cdi-Plugin:

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

Und kompilieren:

mvn install

Jetzt, mit den folgenden Abhängigkeiten in meinem 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>

Ich konnte einen EJB in einem Aktions injizierte bekommen:

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

}

Siehe https: //svn.apache .org / repos / asf / Streben / sandbox / trunk / struts2-cdi-Beispiel / für ein Beispiel.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top