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