ユーザーオブジェクトの@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
を挿入して、そこからユーザーを取得しています。
これは、CDIがタイプ別にBeanを検索し、エンティティとプロデューサーメソッドが同じタイプを返すためです。それが曖昧な理由です。
新しい修飾子を定義し、プロデューサーメソッドで注釈を付ける必要があります。
@Qualifier
@Retention(RUNTIME)
@Target({METHOD, FIELD, PARAMETER, TYPE})
public @interface CurrentUser {
}
このアノテーションをプロデューサーメソッドに追加します。
@Named @Produces @CurrentUser @LoggedIn @SessionScoped
public MyUser getCurrentUser() {return user;}
私は非常によく似た問題を抱えており、いくつかのオフラインヘルプを得ました。私の問題は、サービスがどこにあるかというと、それがデプロイされたearと私のWebプロジェクトにも含まれていたことでした。これは偶発的な複製でした。1つ削除してください。あなたのケースでも同じように機能します。
ここで、次の画像では、esb_khr_web内にesb_khrがあり、削除しました。 Eclipseの場合:プロパティとデプロイメントアセンブリに移動します。
私はエキスパートではありませんが、同様の問題がありました。Bean自体に@Alternative
、プロデューサーが支持されるようにします。私はいくつかの副作用を見逃している可能性がありますが、これは私が見ることができる/必要な限りではうまくいきました。
コンテキストにbeans.xmlの複数のインスタンスがないことを再確認してください。私の場合、WEB-INFとMETA-INFにbeans.xmlがありました。 META-INFからbeans.xmlを削除した後、同様の問題が解決されました。