CDI不明确的依赖关系

Tho*_*hor 13 java cdi jboss-weld

我有一个@SessionScoped @Namedbean @Producer用户对象的方法:

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

这在我的设置(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;
}
Run Code Online (Sandbox Code Playgroud)

这给了我错误:

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()]]]
Run Code Online (Sandbox Code Playgroud)

我不明白第一个依赖项Managed Bean [class test.ejb.MyUser]这个类是一个简单的@Entity并部署在EAR中的ebb.jar中.作为一种解决方法,我正在注入UserBean从那里获取用户.

Mat*_*ndy 22

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

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

@Qualifier
@Retention(RUNTIME)
@Target({METHOD, FIELD, PARAMETER, TYPE})
public @interface CurrentUser {
}
Run Code Online (Sandbox Code Playgroud)

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

@Named @Produces @CurrentUser @LoggedIn @SessionScoped
public MyUser getCurrentUser() {return user;}
Run Code Online (Sandbox Code Playgroud)


CsB*_*ary 5

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

在下图中,我将 esb_khr 放在 esb_khr_web 中,我将其删除。在 Eclipse 中:转到属性和部署程序集。

在此输入图像描述