CDI不明确的依赖关系

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

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

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

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

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

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

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

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

在此处输入图像描述

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