我有一个叫做Navigation的父类和一个叫做ExtendingNavigation的子类。Navigation被注释为@Named("navigation")和@SessionScoped (javax.enterprise.context.SessionScoped;)。在其中,我注入了UserBean并在login()方法中对其进行了初始化。假设我想在其他类中使用userBean。我该怎么做呢?为什么我不能从Navigation扩展
以下是类(仅用于示例):
导航
@Named("navigation")
@SessionScoped
public class Navigation implements Serializable {
private static final long serialVersionUID = 1L;
@Inject
protected UserBean userBean;
public void logout() {
userBean = null;
}
public void login() {
EntityManager em = JPAUtil.getEntityManagerFactory().createEntityManager();
userBean = em.find(UserBean.class, userBean.getUsername());
}
}ExtendingNavigation
public class ExtendingNavigation extends Navigation{
}如果我尝试编译它,它会给我一个错误。
17:01:29,956 ERROR [org.jboss.msc.service.fail] (MSC service thread 1-7) MSC00001: Failed to start service jboss.deployment.unit."timereport.war".WeldService: org.jboss.msc.service.StartException in service jboss.deployment.unit."timereport.war".WeldService: org.jboss.weld.exceptions.DeploymentException: WELD-001409 Ambiguous dependencies for type [NavigationBean] with qualifiers [@Default] at injection point [[field] @Inject timereport.ui.biz.faces.context.ValidateUserAuthenticationAction.navigation]. Possible dependencies [[Managed Bean [class timereport.navigation.NavigationBean] with qualifiers [@Any @Default @Named], Managed Bean [class timereport.navigation.ExtendingNavigation] with qualifiers [@Any @Default]]]
at org.jboss.as.weld.services.WeldService.start(WeldService.java:96)
at org.jboss.msc.service.ServiceControllerImpl$StartTask.startService(ServiceControllerImpl.java:1824) [jboss-msc-1.0.1.GA.jar:1.0.1.GA]
at org.jboss.msc.service.ServiceControllerImpl$StartTask.run(ServiceControllerImpl.java:1759) [jboss-msc-1.0.1.GA.jar:1.0.1.GA]
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:885) [:1.6.0_07]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:907) [:1.6.0_07]
at java.lang.Thread.run(Thread.java:619) [:1.6.0_07]
Caused by: org.jboss.weld.exceptions.DeploymentException: WELD-001409 Ambiguous dependencies for type [NavigationBean] with qualifiers [@Default] at injection point [[field] @Inject timereport.ui.biz.faces.context.ValidateUserAuthenticationAction.navigation]. Possible dependencies [[Managed Bean [class timereport.navigation.NavigationBean] with qualifiers [@Any @Default @Named], Managed Bean [class timereport.navigation.ExtendingNavigation] with qualifiers [@Any @Default]]]
at org.jboss.weld.bootstrap.Validator.validateInjectionPoint(Validator.java:274)
at org.jboss.weld.bootstrap.Validator.validateBean(Validator.java:106)
at org.jboss.weld.bootstrap.Validator.validateRIBean(Validator.java:129)
at org.jboss.weld.bootstrap.Validator.validateBeans(Validator.java:351)
at org.jboss.weld.bootstrap.Validator.validateDeployment(Validator.java:336)
at org.jboss.weld.bootstrap.WeldBootstrap.validateBeans(WeldBootstrap.java:404)
at org.jboss.as.weld.WeldContainer.start(WeldContainer.java:82)
at org.jboss.as.weld.services.WeldService.start(WeldService.java:89)
... 5 more请帮帮我!
发布于 2011-11-25 04:59:30
问题不在于UserBean的注入,你完全可以在其他地方使用它。
问题是您的子类ExtendingNavigation与您的导航类具有相同的限定符(名称为“Navigation”)。用@Named("extendedNavigation")或类似的东西注释ExtendingNavigation,然后在要使用的@Named("extendedNavigation")旁边指定@Inject。
这样想:你说“给我一个X类的实例”,而Weld说“我不知道你想要哪一个”,因为实际上有两个类是导航。
class ValidateUserAuthenticationAction {
@Inject
@Named("extendedNavigation")
private Navigation navigation;
}另外,试着使用接口!导航应该是一个界面。BasicNavigation应该实现它,ExtendedNavigation也应该实现它。
发布于 2011-11-25 04:15:12
您的问题是您在ValidateUserAuthenticationAction类中注入了Navigation的一个实例,但是,正如主要异常所述,您有两个不同的类可以在该注入点使用。解决这个问题的最简单方法是向注入点(如果您选择)和两个Navigation类之一添加一个限定符。
限定符是这个问题的解决方案,以及它们在规范中的全部意义。限定符为注入点添加了额外的歧义消除,或者换句话说,它有助于专门化类和注入点。
发布于 2013-03-19 18:17:55
我有非常类似的问题,我得到了一些离线帮助。我的问题是,在我的服务所在的位置,它包含在部署的ear中,也包含在我的web项目中。这是一个意外的复制,丢掉一个,如果它也是你的情况,它将会工作。
在下面的图片中,我把esb_khr放在esb_khr_web里面,我把它去掉了。在eclipse中:转到属性和部署程序集。

https://stackoverflow.com/questions/8244564
复制相似问题