Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 扩展@Named@SessionScoped bean_Java_Jakarta Ee_Ejb_Cdi_Named - Fatal编程技术网

Java 扩展@Named@SessionScoped bean

Java 扩展@Named@SessionScoped bean,java,jakarta-ee,ejb,cdi,named,Java,Jakarta Ee,Ejb,Cdi,Named,我有父类名为Navigation,子类名为ExtendingNavigation导航被注释为@Named(“导航”)和@SessionScoped(javax.enterprise.context.SessionScoped;)。我在其中注入UserBean,并在login()方法中初始化它。假设我想在其他类中使用userBean。我怎么做?为什么我不能从导航扩展 以下是类(仅作为示例): 航行 @Named("navigation") @SessionScoped public class N

我有父类名为
Navigation
,子类名为
ExtendingNavigation
<代码>导航被注释为
@Named(“导航”)
@SessionScoped
(javax.enterprise.context.SessionScoped;)。我在其中注入
UserBean
,并在
login()
方法中初始化它。假设我想在其他类中使用
userBean
。我怎么做?为什么我不能从
导航扩展

以下是类(仅作为示例):

航行

@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());
    }
}
public class ExtendingNavigation extends 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());
    }
}
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

请帮忙

您的问题是,您正在类
ValidateUserAuthenticationAction
中注入一个
Navigation
的实例,但是,在注入点可以使用两个不同的类,就像主异常状态一样。解决此问题的最简单方法是向注入点(如果您选择)和两个
导航
类之一添加限定符


限定符是这个问题的解决方案,也是它们在规范中的全部要点。限定符为注入点添加了额外的歧义消除,或者换句话说,它有助于专门化类和注入点。

问题不是注入
用户bean,您完全可以在其他地方使用它

问题是子类
ExtendingNavigation
Navigation
类(名称“Navigation”)具有相同的限定符。用
@Named(“extendedNavigation”)
或类似的东西注释
extendedingNavigation
,然后将
@Named(“extendedNavigation”)
指定在您希望使用它的
@Inject
旁边

这样想:你说的是“给我一个X类的实例”,Weld说的是“我不知道你想要哪个”,因为实际上有两个类是导航类

class ValidateUserAuthenticationAction {
    @Inject
    @Named("extendedNavigation")
    private Navigation navigation;
}

另外,尝试使用接口!导航应该是一个界面。基本导航应该实现它,扩展导航也应该实现它。

我遇到了非常类似的问题,我得到了一些脱机帮助。我的问题是,在我的服务所在的地方,它包括在已部署的ear中,也包括在我的web项目中。这是一个偶然的重复,退出一个,如果它是你的情况下也会工作

在下图中,我将esb_khr_web中的esb_khr移除。在eclipse中:转到属性和部署程序集


您遇到的错误是什么?堆栈跟踪?thanksI发布了stacktrace中出现错误的确切部分。假设上面示例中的导航bean在我的codeP.S中被称为NavigationBean。命名ExtendingNavigation或对SessionScoped没有帮助。这信息太少了吗?
@Named
是一个限定符。只需给子类一个不同的
@Named
Named是特殊的,但通常不会像其他限定符那样处理。看起来我错了,抱歉。