web-dev-qa-db-ja.com

CDIあいまいな依存関係

ユーザーオブジェクトの@SessionScoped @Namedメソッドを持つ@Producer Beanがあります。

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

これは私の設定(JBoss-7.1.1-Final)で正常に機能し、#{currentUser.name}を使用してJSFページからユーザーフィールドにアクセスすることは問題ありません。修飾子はorg.jboss.seam.security.annotations.LoggedInです。ここで、別の@Inject Beanのフィールドでこのユーザーを@Namedしたいと思います。

@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()]]]

最初の依存関係がわかりませんManaged Bean [class test.ejb.MyUser]このクラスは単純な@Entityであり、EARのebb.jarにデプロイされます。回避策として、現在UserBeanを挿入して、そこからユーザーを取得しています。

13
Thor

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

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

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

このアノテーションをプロデューサーメソッドに追加します。

@Named @Produces @CurrentUser @LoggedIn @SessionScoped
public MyUser getCurrentUser() {return user;}
22
Matt Handy

私は非常によく似た問題を抱えており、いくつかのオフラインヘルプを得ました。私の問題は、サービスがどこにあるかというと、それがデプロイされたearと私のWebプロジェクトにも含まれていたことでした。これは偶発的な複製でした。1つ削除してください。あなたのケースでも同じように機能します。

ここで、次の画像では、esb_khr_web内にesb_khrがあり、削除しました。 Eclipseの場合:プロパティとデプロイメントアセンブリに移動します。

enter image description here

4
CsBalazsHungary

私はエキスパートではありませんが、同様の問題がありました。Bean自体に@Alternative、プロデューサーが支持されるようにします。私はいくつかの副作用を見逃している可能性がありますが、これは私が見ることができる/必要な限りではうまくいきました。

2
geert3

コンテキストにbeans.xmlの複数のインスタンスがないことを再確認してください。私の場合、WEB-INFとMETA-INFにbeans.xmlがありました。 META-INFからbeans.xmlを削除した後、同様の問題が解決されました。

0
aborskiy