Java Glassfish 4.1 CDI焊接-001409:不明确的依赖关系

Java Glassfish 4.1 CDI焊接-001409:不明确的依赖关系,java,glassfish,cdi,java-ee-7,Java,Glassfish,Cdi,Java Ee 7,我在一个部署在Glassfish 4.1中的项目中工作。依赖项注入是使用CDI进行的,我在尝试部署应用程序时遇到了一个问题。我得到的错误如下(通常我会在代码中“翻译”我的类的名称,这样整个帖子都是用同一种语言写的,我现在不会这样做,这样我就可以复制/粘贴并避免一些翻译输入错误): 服务器日志 (顺便说一下,我不知道为什么它会显示3个异常,并且所有异常都显示为异常0) 相关课程 对于每个注入点,我只有一个可注入类,所以我不明白注入失败的原因。我不知道是否需要更多关于我的代码的细节,所以问我,我会编

我在一个部署在Glassfish 4.1中的项目中工作。依赖项注入是使用CDI进行的,我在尝试部署应用程序时遇到了一个问题。我得到的错误如下(通常我会在代码中“翻译”我的类的名称,这样整个帖子都是用同一种语言写的,我现在不会这样做,这样我就可以复制/粘贴并避免一些翻译输入错误):

服务器日志 (顺便说一下,我不知道为什么它会显示
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