【问题标题】:CDI Ambiguous dependenciesCDI 模糊依赖
【发布时间】:2012-04-28 11:34:45
【问题描述】:

我有一个 @SessionScoped @Named bean 和一个用于用户对象的 @Producer 方法:

@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这个用户在一个字段中的另一个@Named Bean:

@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 从那里获取用户。

【问题讨论】:

    标签: java cdi jboss-weld


    【解决方案1】:

    这是因为 CDI 按类型搜索 bean,而您的实体和生产者方法返回相同的类型。这就是为什么它是模棱两可的。

    您需要定义一个新的限定符并使用您的生产者方法对其进行注释。

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

    将此注释添加到您的生产者方法中:

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

    【讨论】:

    • 或者修改LoggedIn注解,添加Qualifier。好像没有Qualifier
    【解决方案2】:

    我遇到了非常相似的问题,我得到了一些离线帮助。我的问题是,我的服务在哪里,它包含在部署的耳朵和我的网络项目中。这是一个意外的重复,删除一个,如果它也是你的情况,它也会起作用。

    在下面的图片中,我在 esb_khr_web 中有 esb_khr,我删除了。在 Eclipse 中:转到属性和部署程序集。

    【讨论】:

      【解决方案3】:

      我不是专家,但我遇到了类似的问题,我以更简单的方式修复了它,通过使用@Alternative 注释 bean 本身,以便生产者受到青睐。可能是我遗漏了一些副作用,但据我所见/需要,这很有效。

      【讨论】:

      • 非常感谢。这个@Alternative 注释似乎已被完全遗忘。
      【解决方案4】:

      请仔细检查您的上下文中没有多个 beans.xml 实例。就我而言,我在 WEB-INF 和 META-INF 中有 beans.xml。从 META-INF 中删除 beans.xml 后,类似的问题得到了解决。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-08-09
        • 2021-09-08
        • 2014-12-27
        • 2020-08-02
        • 1970-01-01
        • 2012-08-10
        • 2015-07-06
        • 2016-10-11
        相关资源
        最近更新 更多