3

@EJB アノテーションを使用して ejb.jar ファイルに EJB へのリモート参照を挿入しようとしているアプリがあります。一貫性のない結果が得られます。あるケースでは、呼び出される web.xml にリスナーがあり、EJB に接続してその上でメソッドを呼び出していることがわかるため、EJB が正しく注入されているようです。別のクラス (struts2 アクション) で、EJB 参照にアクセスしようとすると NPE が発生します。私が知る限り、それらは同じ .war ファイルに存在する Java クラスの同一の呼び出しです。

回避策として、グローバル JNDI 名で EJB をルックアップするコードをコンストラクターに追加したところ、正常に動作しました。ある @EJB が機能し、別の @EJB が機能しない理由がわかりません。

4

1 に答える 1

3

Struts 2 アクションに EJB をどのように注入しますか? CDIを使用していますか?Struts2 CDI プラグインを使用していますか?

更新:問題は、コンテナーが Struts オブジェクトを作成していないことです。Struts は作成しているため、コンテナーは何も注入する機会がありません。アクションでインジェクションを有効にするには、前述の CDI 用プラグインを使用する必要があります。

試してみたい場合は、Struts 2 のソースを入手してください。

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

次にcdstruts2ディレクトリに移動し、次のコマンドを実行します (これにより、に必要なモジュールがコンパイルされますstruts-cdi-plugin) 。

mvn install -pl plugins -am

次に、cdi-plugin のソースを取得します。

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

そしてそれをコンパイルします:

mvn install

さて、私の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>

アクションに EJB を挿入することができました。

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/struts/sandbox/trunk/struts2-cdi-example/を参照してください。

于 2010-05-18T19:11:00.657 に答える