17

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

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

これは私のセットアップ (JBoss-7.1.1-Final) では問題なく動作し、JSF ページからユーザー フィールドにアクセスするのに問題はありません#{currentUser.name}。修飾子はorg.jboss.seam.security.annotations.LoggedIn. 今、私は@Injectこのユーザーを別の@NamedBean のフィールドに入れたい:

@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、そこからユーザーを取得することを注入しています。

4

4 に答える 4

22

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

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

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

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

@Named @Produces @CurrentUser @LoggedIn @SessionScoped
public MyUser getCurrentUser() {return user;}
于 2012-04-17T06:44:38.663 に答える
5

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

次の図では、esb_khr_web 内に esb_khr がありましたが、削除しました。Eclipse の場合: プロパティと展開アセンブリに移動します。

ここに画像の説明を入力

于 2013-03-19T10:39:12.850 に答える
4

私は専門家ではありませんが、同様の問題がありました。Bean 自体に で注釈を付け@Alternativeて、Producer が優先されるようにすることで、より簡単な方法で修正しました。いくつかの副作用が欠けている可能性がありますが、これは私が見ることができる/必要な限り機能しました.

于 2016-07-21T20:45:24.027 に答える