質問

私は次のように EJB です。

public class Bar() {

     private String s;

     public Bar() {
         this.s = "bar";
     }

     @Inject public Bar(String s) {
         this.s = s;
     }

}
.

  1. arg-constructor を別のFooクラスに使用することで、そのBeanを注入する方法は?

  2. 次に、FooクラスをEJBとして定義し、 di を別のクラスに実行することを目的としています(たとえば、WebServletなど)。Fooクラスインスタンスを挿入してStringクラスインスタンスを内部依存

  3. として正しく設定することで、どのようにしてBarクラスインスタンスを注入できますか。

  4. 上記の点を達成するためにBarを定義するためのより良い方法はありますか?

役に立ちましたか?

解決

注釈付きコンストラクター噴射は、誰かが挿入するバーのインスタンスを要求するたびにCDIに指示し、それは@Injectでマークされたコンストラクタを使用するべきです。

CDIコンテナは、必要なすべてのコンストラクタパラメータのインスタンスを取得し、「文字列」を処理できないために失敗します。どの文字列を意味するかわからない。

プロデューサーと修飾子を使用して、どの文字列を望むかを伝えることで、コンテナが依存関係を解決するのを助けなければなりません。私はちょうどあなたにここで最も単純な解決策を与える:

public class Bar {

 @Inject 
 public Bar(@Named("myString") String s) {
     this.s = s;
 }
}
.

以降のクラス(別のクラスである必要はありませんが、それほど読みやすい):

public class MyStringProducer {
  @Produces
  @Named("myString")
  public String getMyString() {
    return ...; // whatever you want ... read JSON, parse properties, randomize ...
  }
}
.

他のヒント

@Injectは、 "managed"オブジェクトを注入しているときにのみ機能します。文字列は管理対象のオブジェクトではなく、これは勝ちました。T work。

しかし、次の例は機能するべきです(ここでは春を使用しています。使用しているライブラリに従ってDI Initializatonコードを使用):

@Named
public class Foo {

    @Inject
    Bar bar;

    public static void main(String[] args) {
        ApplicationContext ctx = new AnnotationConfigApplicationContext("com.pkg1");
        Foo foo = (Foo)ctx.getBean("foo");

        System.out.println(foo.bar.getString());

    }


}

@Named
public class Bar {
    private String s;
    public Bar() {
        this.s = "bar";
    }
   @Inject 
   public Bar(Bar1 bar1) {
        this.s = bar1.getS();
    }
    public String getString() {
        return s;
    }
}

@Named
class Bar1 {
    private String s="bar1";
    public String getS() {
        return s;
    }
}
.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top