CDI不明确的依赖关系

时间:2012-04-17 06:04:41

标签: java cdi jboss-weld

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

4 个答案:

答案 0 :(得分:22)

这是因为CDI按类型搜索bean,您的实体和producer方法返回相同的类型。这就是为什么它含糊不清。

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

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

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

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

答案 1 :(得分:3)

我遇到了类似的问题,我得到了一些离线帮助。我的问题是我的服务在哪里,它也包含在已部署的耳朵和我的网络项目中。这是一个意外的重复,丢掉一个,如果你的情况也是如此。

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

enter image description here

答案 2 :(得分:2)

我不是专家,但我有类似的问题,我用更简单的方法修改它,用@Alternative注释bean本身,以便生产者受到青睐。可能是我错过了一些副作用,但这在我能看到/需要的情况下起作用。

答案 3 :(得分:0)

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