2016-09-19 14 views
2

クラスBにセッターとゲッターが含まれているクラスA、B、Cがあるとします。 クラスAでクラスBを使用したい(クラスBでセッター演算を実行するにはtrueを設定)、クラスC(クラスBでゲッター操作を実行する)。 しかし、問題は私が直面しているのは、同じクラスBオブジェクトに対してgetを実行すると、falseが印刷される代わりにClass Cで印刷されるべきであるということです。したがって、デフォルトでは、彼らはすべての@Dependentになります - スニペットがクラスで@Injectアノテーションを使用する際のエラー

Class A { 
    @Inject 
    B b; 
    //Setting true 
    b.set(true); 
} 

Class B { 
    boolean b; 
    //Setter 
    //Getter 
} 

Class C { 
    @Inject 
    B b; 
    // 
    boolean ball=b.get(); 
    Log.info(ball) //False is getting printed instead of true why is this!! 
} 
+1

注入された 'b'をどのように作成しますか?いくつかのコード、または構成ファイルですか?あなたは 'b'を本当にどのように設定しますか? [最小限で完全で検証可能なサンプルを作成する方法](http://stackoverflow.com/help/mcve)をお読みください。 –

+0

設定ファイルを使用しないCDI Beanです。依存関係注入は何もしません。setterメソッドを使用してbをtrueに設定します。 –

答えて

2

問題は、あなたがあなたの豆に範囲を与えていないで、以下のようです。それは状況によっては問題ありませんが、別のbeanに@Dependent beanを注入すると、という新しいインスタンスが作成されます。

あなたがClass Aに注射すると、class Cに注射したものと等しくなりません。

これを解決する方法は?

たとえば、class B@ApplicationScopedにすることができます。アプリケーションスコープは、CDiコンテナブート(=開始から)まで続きます。そうすれば、アプリケーション全体に1つのインスタンスが存在するため、Beanの状態は、それを注入するすべての場所で共有されます。

@ApplicationScoped 
Class B { 
    boolean b; 
    //Setter 
    //Getter 
} 

もう1つの答えは、@Singletonを使用することを示しています。あなたがEE環境にいる場合は、特に反対してください。

関連する問題