6

私は CDI のコンストラクター インジェクションがとても気に入っていますが、コンストラクター インジェクションが期待どおりに機能しないユースケースを見つけました。

私の例では、2 つのクラスがあります。クラス「BeanA」には明示的なスコープが定義されておらず、Serializable を実装していません。クラス「BeanB」には @SessionScoped のアノテーションが付けられており、Serializable を実装しています。

public class BeanA{
}

@SessionScoped
public class BeanB implements Serializable{
    @Inject
    private BeanA beanA;
}

もちろん、BeanA のインスタンスを BeanB に注入しようとすると、BeanA はシリアル化できないため、Weld から UnserializableDependencyException が発生します。これは予期される動作です。

フィールド「beanA」を「transient」でマークすると、注入は問題なく機能します。

@Inject
private transient BeanA beanA;

現在、Weld は例外をスローしません。

これは私にとってはまったく問題ありませんが、コンストラクター注入でこれを機能させたい場合、私の理解の問題が発生します。次のことを行うと、もう機能しません。

@SessionScoped
public class BeanB implements Serializable{
    private transient BeanA beanA;

    @Inject
    public BeanB(BeanA beanA){
        this.beanA = beanA;
    }

    public BeanB(){}
}

このコードでは、 UnserializableDependencyException が再び発生します。コンストラクター注入とフィールド注入は多かれ少なかれ同等だと思っていましたが、明らかにそうではありません。私の間違いは何ですか?

4

1 に答える 1

2

それはバグのようです。BeanA をシリアライズ可能にすると、すべてがうまく機能しますか? また、どのバージョンの Weld を使用していますか?

于 2012-01-16T21:52:36.660 に答える