2012-04-17 21 views
13

私はユーザーオブジェクトの@Producer方法で@SessionScoped @Named Beanを持っている:CDIあいまいな依存関係

@Named @SessionScoped 
public class UserBean implements Serializable 
{ 
    //... 
    @Named @Produces @LoggedIn @SessionScoped 
    public MyUser getCurrentUser() {return user;} 
} 

これは私の設定(JBoss版-7.1.1-決勝)では正常に動作し、それがユーザーにアクセスするには問題ありませんJSFページのフィールドは#{currentUser.name}です。修飾子はorg.jboss.seam.security.annotations.LoggedInです。今、私は別の@Named豆のフィールドに、このユーザ@Injectしたい:

@Named 
public class FavBean implements Serializable 
{ 
    private @Inject @LoggedIn MyUser currentUser; 
} 

これは私にエラーを与える:

org.jboss.weld.exceptions.DeploymentException: 
WELD-001409 Ambiguous dependencies for type [MyUser] with qualifiers [@Default] at 
    injection point [[field] @Inject @LoggedIn test.FavBean.currentUser]. 
Possible dependencies [[Managed Bean [class test.ejb.MyUser] with qualifiers 
    [@Any @Default], 
Producer Method [MyUser] with qualifiers [@Any @Default] declared as [[method] 
    @Named @Produces @LoggedIn @SessionScoped public test.UserBean.getCurrentUser()]]] 

は、私はこのクラスは、単純な@Entityある最初の依存関係Managed Bean [class test.ejb.MyUser]を理解していませんEARのebb.jarにデプロイされます。回避策として、私は現在UserBeanをそこから注入しています。

答えて

22

これは、CDIがタイプ別にBeanを検索し、エンティティとプロデューサメソッドが同じタイプを返すためです。それがあいまいである理由です。

新しい修飾子を定義し、それをプロデューサメソッドで注釈する必要があります。

@Qualifier 
@Retention(RUNTIME) 
@Target({METHOD, FIELD, PARAMETER, TYPE}) 
public @interface CurrentUser { 
} 

プロデューサメソッドにこの注釈を追加します。

@Named @Produces @CurrentUser @LoggedIn @SessionScoped 
public MyUser getCurrentUser() {return user;} 
+1

「LoggedIn」注釈に「Qualifier」を追加して変更します。それは '修飾子'がないようです。 –

3

私は非常によく似た問題を抱えていた、と私はいくつかのオフラインの助けを得ました。私の問題は、私のサービスがどこにあったのか、それは配備された耳に、私のウェブプロジェクトにも含まれていたことでした。それは偶発的な重複であり、1つ落としてください、それがあなたのケースでもあるならばうまくいくでしょう。

ここに次の写真私はesb_khr_webの中にesb_khrを持っていましたが、削除しました。 eclipseで:プロパティーとデプロイメント・アセンブリーに進みます。

enter image description here

2

私は専門家ではないが、私は同様の問題があったが、プロデューサーが好まれているように私は、@Alternativeと豆自体に注釈を付けることで、簡単な方法でそれを修正しました。私はいくつかの副作用を見逃している可能性がありますが、これは私が見える/必要とする限りで働いた。

関連する問題