2012-01-12 13 views
4

CDIのコンストラクタインジェクションが大好きですが、今はコンストラクタインジェクションが期待通りに動作しないケースがあります。CDIコンストラクタインジェクションは、一時的ではないシリアル化不可能な依存関係では機能しません。

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

public class BeanA{ 
} 

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

私はBeanAはシリアライズではないので、私は溶接からUnserializableDependencyExceptionを取得讲义1コースのBeanBにBeanAのインスタンスを注入してみてください。これは予想される動作です。

私は「一過性」とフィールド「beanA」をマークすると、注射は問題なく動作します。

@Inject 
private transient BeanA beanA; 

今ウェルドが例外をスローしません。

これは私にとってはまったく問題ですが、コンストラクタインジェクションでこれを動作させたいときは、私の理解の問題があります。私が次のことを行うともう動作しません。

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

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

    public BeanB(){} 
} 

このコードでは、もう一度UnserializableDependencyExceptionを取得します。私はコンストラクタの注入とフィールド注入は多かれ少なかれ同等であると思ったが、明らかにそうではない。私の間違いは何ですか?

答えて

1

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

+0

お返事ありがとうございます。私はweld-servletの "1.0.1-Final"バージョンと "1.1.5.Final"バージョンでテストしました。 BeanAをシリアライズ可能にすると、うまく動作します。私自身のクラスではこれが解決策になりますが、他のフレームワークからクラスを注入したいときにはまだ問題があります。 –

+0

私はCDI仕様を調べて、動作を説明する段落を見つけました:[リンク](http://docs.jboss.org/cdi/spec/1.0/html/contexts.html#passivatingscope)、6.6.4 "パッシベーション可能なスコープを宣言するマネージドBean [...]が非過渡注入フィールド、パッシベーション可能な依存関係に解決されないBeanコンストラクタパラメータまたはイニシャライザメソッドパラメータを持つ場合[...]コンテナが自動的に検出しますその問題を展開の問題として扱います。 "明らかにこれは期待された動作ですが、私はこの差別化の理由が何であるか完全に理解していません –

+0

私はそれを見ましたが、例外があったはずです。 WeldのJIRAを上げてください。 – LightGuard