Java Glassfish 4.1 CDI焊接-001409:不明确的依赖关系
我在一个部署在Glassfish 4.1中的项目中工作。依赖项注入是使用CDI进行的,我在尝试部署应用程序时遇到了一个问题。我得到的错误如下(通常我会在代码中“翻译”我的类的名称,这样整个帖子都是用同一种语言写的,我现在不会这样做,这样我就可以复制/粘贴并避免一些翻译输入错误): 服务器日志 (顺便说一下,我不知道为什么它会显示Java Glassfish 4.1 CDI焊接-001409:不明确的依赖关系,java,glassfish,cdi,java-ee-7,Java,Glassfish,Cdi,Java Ee 7,我在一个部署在Glassfish 4.1中的项目中工作。依赖项注入是使用CDI进行的,我在尝试部署应用程序时遇到了一个问题。我得到的错误如下(通常我会在代码中“翻译”我的类的名称,这样整个帖子都是用同一种语言写的,我现在不会这样做,这样我就可以复制/粘贴并避免一些翻译输入错误): 服务器日志 (顺便说一下,我不知道为什么它会显示3个异常,并且所有异常都显示为异常0) 相关课程 对于每个注入点,我只有一个可注入类,所以我不明白注入失败的原因。我不知道是否需要更多关于我的代码的细节,所以问我,我会编
3个异常
,并且所有异常都显示为异常0
)
相关课程
对于每个注入点,我只有一个可注入类,所以我不明白注入失败的原因。我不知道是否需要更多关于我的代码的细节,所以问我,我会编辑这篇文章;我只写我认为需要的部分
我看过另一篇文章,但是那里使用了@生成的注释,而且,好吧,我不需要这种情况
感谢您的帮助或指导。提前感谢您的回答
编辑1
我在中的一篇文章中读到,CDI是通过属性(甚至是私有的)、setter方法或构造函数生成的。考虑到这一点,我删除了每个注入属性的getter和setter,并解决了这些属性对default(包)的访问
注入属性的getter/setter方法仅用于在我的单元测试中手动设置依赖项,因此在生产中不需要它们
在所有这些更改之后,错误仍然存在
更多信息
根据,我的Bean符合CDI托管Bean定义,除了点
它没有使用定义注释的EJB组件进行注释,也没有在EJB-jar.xml中声明为EJB bean类
根据EJB组件定义,注释是以下内容之一:@MessageDriven
、@Stateful
、@Stateless
或@Singleton
。但我见过其他使用CDI的项目使用EJB(例如,@Stateless
bean被注入到其他地方)。另一方面,我一直在阅读,那里说(第2章-上下文和依赖注入):
CDI豆的解剖结构
根据CDI 1.1规范,容器将满足以下条件的任何类视为CDI Bean:
- 它不是一个非静态的内部类
- 它是一个具体的类,或者被注释为@Decorator,并且
- 它有一个没有参数的默认构造函数,或者它声明了一个带注释的@Inject构造函数
然后,bean可以有一个可选的作用域、一个可选的EL名称、一组拦截器绑定和一个可选的生命周期管理
我的bean符合这个定义。我检查并引入了CDIBean的定义,它更接近第一个定义(来自JavaEE文档)。正如我所说,问题是,我见过其他项目使用EJB管理的bean(@Stateless
或其他一些)进行依赖项注入
总之,我不知道该相信谁。有人能解释一下这件事吗
失败的尝试
注意:在这次尝试之后,我在不同的地方遇到了相同的问题,因此服务器日志和涉及的类与上述内容不同,请检查差异
首先,根据直觉,我向bean添加了接口,我需要将这些接口注入到其他地方
其次,我将Glassfish服务器从4.1更新为4.1.1。这一个捆绑了WELD-2.2.13.Final
CDI实现(根据服务器日志消息INFO:WELD-000900:2.2.13(Final)
)
最后,我尝试部署我的项目,但仍然存在一些更改。在显示更改之前,我要说的是,它从未引起我的注意,但在部署时,JNDI为我的bean生成了2个名称,正如我尝试部署应用程序时抛出的以下日志消息中所述:
INFO: Portable JNDI names for EJB RepositorioUsuarioImpl: [java:global/sigea-ear-0.8-SNAPSHOT/sigea-model-0.8-SNAPSHOT/RepositorioUsuarioImpl, java:global/sigea-ear-0.8-SNAPSHOT/sigea-model-0.8-SNAPSHOT/RepositorioUsuarioImpl!ar.edu.unt.sigea.repositorio.RepositorioUsuario]
INFO: Portable JNDI names for EJB RepositorioAlumnoImpl: [java:global/sigea-ear-0.8-SNAPSHOT/sigea-model-0.8-SNAPSHOT/RepositorioAlumnoImpl, java:global/sigea-ear-0.8-SNAPSHOT/sigea-model-0.8-SNAPSHOT/RepositorioAlumnoImpl!ar.edu.unt.sigea.repositorio.RepositorioAlumno]
INFO: Portable JNDI names for EJB RepositorioMenuImpl: [java:global/sigea-ear-0.8-SNAPSHOT/sigea-model-0.8-SNAPSHOT/RepositorioMenuImpl, java:global/sigea-ear-0.8-SNAPSHOT/sigea-model-0.8-SNAPSHOT/RepositorioMenuImpl!ar.edu.unt.sigea.repositorio.RepositorioMenu]
INFO: Portable JNDI names for EJB GestorUsuariosImpl: [java:global/sigea-ear-0.8-SNAPSHOT/sigea-model-0.8-SNAPSHOT/GestorUsuariosImpl, java:global/sigea-ear-0.8-SNAPSHOT/sigea-model-0.8-SNAPSHOT/GestorUsuariosImpl!ar.edu.unt.sigea.servicios.GestorUsuarios]
INFO: Portable JNDI names for EJB GestorPersonasImpl: [java:global/sigea-ear-0.8-SNAPSHOT/sigea-model-0.8-SNAPSHOT/GestorPersonasImpl!ar.edu.unt.sigea.servicios.GestorPersonas, java:global/sigea-ear-0.8-SNAPSHOT/sigea-model-0.8-SNAPSHOT/GestorPersonasImpl]
INFO: Portable JNDI names for EJB RepositorioPersonaImpl: [java:global/sigea-ear-0.8-SNAPSHOT/sigea-model-0.8-SNAPSHOT/RepositorioPersonaImpl, java:global/sigea-ear-0.8-SNAPSHOT/sigea-model-0.8-SNAPSHOT/RepositorioPersonaImpl!ar.edu.unt.sigea.repositorio.RepositorioPersona]
INFO: Portable JNDI names for EJB RepositorioOperacionImpl: [java:global/sigea-ear-0.8-SNAPSHOT/sigea-model-0.8-SNAPSHOT/RepositorioOperacionImpl!ar.edu.unt.sigea.repositorio.RepositorioOperacion, java:global/sigea-ear-0.8-SNAPSHOT/sigea-model-0.8-SNAPSHOT/RepositorioOperacionImpl]
我不知道这是否会导致注射点的错误,但听起来很可疑(我不知道如何改变这一点)。它也出现在第一次尝试中,但正如我所说,它从未引起我的注意。现在是日志和类
服务器日志
相关课程
主要部分显示了注入的油田
如果您能为我提供这些新信息,我将不胜感激。如果你需要更多关于应用程序的信息,请告诉我
提前感谢您的回答。在将互联网颠倒了两周后,我终于尝试在Wildfly 10.0.0服务器上部署,现在我的应用程序部署没有问题。所以我必须得出结论,这是一种玻璃鱼上的虫子。Pitty,因为我使用的是最新版本(4.1.1),它是CDI发现的基础(我认为)。希望这能解决这个问题,但我现在不会尝试
我必须说:如果一台服务器被认为是“符合JavaEE7标准的”,那么它就不应该被发布时带有这种bug
如果有人知道某个论坛,或者知道不同服务器的一些基准测试结果,请将其评论出来你真丢脸Glassfish我在Payara遇到了同样的问题,我通过删除EAR模块中的依赖项解决了这个问题
所以之前,我的EAR模块依赖于EJB模块,
我的war模块也依赖于EJB模块。
因此,在构建时,我认为它们都生成了两次类,并最终混淆了CDI。
因此,消除EAR对EJB模块的依赖性问题解决了,这有点冒险,但我也遇到了一些类似的问题。我的解决方案是禁用Glassfish的隐式cdi特性(在4.x中默认启用)
部署时:
asadmin deploy --property implicitCdiEnabled=false ...
或作为服务器范围的配置:
asadmin set configs.config.server-config.cdi-service.enable-implicit-cdi=false
再说一次,停止使用玻璃鱼,改用野蝇之类的东西似乎是正确的选择
INFO: Portable JNDI names for EJB RepositorioUsuarioImpl: [java:global/sigea-ear-0.8-SNAPSHOT/sigea-model-0.8-SNAPSHOT/RepositorioUsuarioImpl, java:global/sigea-ear-0.8-SNAPSHOT/sigea-model-0.8-SNAPSHOT/RepositorioUsuarioImpl!ar.edu.unt.sigea.repositorio.RepositorioUsuario]
INFO: Portable JNDI names for EJB RepositorioAlumnoImpl: [java:global/sigea-ear-0.8-SNAPSHOT/sigea-model-0.8-SNAPSHOT/RepositorioAlumnoImpl, java:global/sigea-ear-0.8-SNAPSHOT/sigea-model-0.8-SNAPSHOT/RepositorioAlumnoImpl!ar.edu.unt.sigea.repositorio.RepositorioAlumno]
INFO: Portable JNDI names for EJB RepositorioMenuImpl: [java:global/sigea-ear-0.8-SNAPSHOT/sigea-model-0.8-SNAPSHOT/RepositorioMenuImpl, java:global/sigea-ear-0.8-SNAPSHOT/sigea-model-0.8-SNAPSHOT/RepositorioMenuImpl!ar.edu.unt.sigea.repositorio.RepositorioMenu]
INFO: Portable JNDI names for EJB GestorUsuariosImpl: [java:global/sigea-ear-0.8-SNAPSHOT/sigea-model-0.8-SNAPSHOT/GestorUsuariosImpl, java:global/sigea-ear-0.8-SNAPSHOT/sigea-model-0.8-SNAPSHOT/GestorUsuariosImpl!ar.edu.unt.sigea.servicios.GestorUsuarios]
INFO: Portable JNDI names for EJB GestorPersonasImpl: [java:global/sigea-ear-0.8-SNAPSHOT/sigea-model-0.8-SNAPSHOT/GestorPersonasImpl!ar.edu.unt.sigea.servicios.GestorPersonas, java:global/sigea-ear-0.8-SNAPSHOT/sigea-model-0.8-SNAPSHOT/GestorPersonasImpl]
INFO: Portable JNDI names for EJB RepositorioPersonaImpl: [java:global/sigea-ear-0.8-SNAPSHOT/sigea-model-0.8-SNAPSHOT/RepositorioPersonaImpl, java:global/sigea-ear-0.8-SNAPSHOT/sigea-model-0.8-SNAPSHOT/RepositorioPersonaImpl!ar.edu.unt.sigea.repositorio.RepositorioPersona]
INFO: Portable JNDI names for EJB RepositorioOperacionImpl: [java:global/sigea-ear-0.8-SNAPSHOT/sigea-model-0.8-SNAPSHOT/RepositorioOperacionImpl!ar.edu.unt.sigea.repositorio.RepositorioOperacion, java:global/sigea-ear-0.8-SNAPSHOT/sigea-model-0.8-SNAPSHOT/RepositorioOperacionImpl]
Fatal: Exception during lifecycle processing
org. glassfish.deployment.common.DeploymentException: CDI deployment failure:Exception List with 2 exceptions:
Exception 0 :
org.jboss.weld.exceptions.DeploymentException: WELD-001409: Ambiguous dependencies for type GestorPersonas with qualifiers @Default
at injection point [BackedAnnotatedField] @Inject ar.edu.unt.sigea.inicio.RegistroBean.gestorPersonas
at ar.edu.unt.sigea.inicio.RegistroBean.gestorPersonas(RegistroBean.java:0)
Possible dependencies:
- Session bean [class ar.edu.unt.sigea.servicios.impl.GestorPersonasImpl with qualifiers [@Any @Default]; local interfaces are [GestorPersonas],
- Managed Bean [class ar.edu.unt.sigea.servicios.impl.GestorPersonasImpl] with qualifiers [@Any @Default]
...[Stack trace]...
Exception 0 :
org.jboss.weld.exceptions.DeploymentException: WELD-001409: Ambiguous dependencies for type GestorUsuarios with qualifiers @Default
at injection point [BackedAnnotatedField] @Inject ar.edu.unt.sigea.inicio.SesionUsuarioBean.gestorUsuarios
at ar.edu.unt.sigea.inicio.SesionUsuarioBean.gestorUsuarios(SesionUsuarioBean.java:0)
Possible dependencies:
- Session bean [class ar.edu.unt.sigea.servicios.impl.GestorUsuariosImpl with qualifiers [@Any @Default]; local interfaces are [GestorUsuarios],
- Managed Bean [class ar.edu.unt.sigea.servicios.impl.GestorUsuariosImpl] with qualifiers [@Any @Default]
...[Stack trace]...
@Named(value = "registroBean")
@ViewScoped
public class RegistroBean implements Serializable {
private static final long serialVersionUID = 2181909526300424451L;
@Inject
GestorPersonas gestorPersonas;
// fields, methods, etc
}
@Named(value = "sesionUsuarioBean")
@SessionScoped
public class SesionUsuarioBean implements Serializable {
private static final long serialVersionUID = 2938631472102116238L;
@Inject
GestorUsuarios gestorUsuarios;
// fields, methods, etc
}
asadmin deploy --property implicitCdiEnabled=false ...
asadmin set configs.config.server-config.cdi-service.enable-implicit-cdi=false