gpt4 book ai didi

java - Glassfish 4.1 CDI WELD-001409 : Ambiguous dependencies

转载 作者:行者123 更新时间:2023-11-30 02:53:18 25 4
gpt4 key购买 nike

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

org.glassfish.deployment.common.DeploymentException: CDI deployment failure:Exception List with 3 exceptions:
Exception 0 :
org.jboss.weld.exceptions.DeploymentException: WELD-001409: Ambiguous dependencies for type GestorUsuarios with qualifiers @Default
at injection point [BackedAnnotatedField] @Inject private ar.edu.unt.sigea.servicios.impl.GestorPersonasImpl.gestorUsuarios
at ar.edu.unt.sigea.servicios.impl.GestorPersonasImpl.gestorUsuarios(GestorPersonasImpl.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]...

Exception 0 :
org.jboss.weld.exceptions.DeploymentException: WELD-001409: Ambiguous dependencies for type RepositorioMenu with qualifiers @Default
at injection point [BackedAnnotatedField] @Inject private ar.edu.unt.sigea.servicios.impl.GestorUsuariosImpl.repositorioMenu
at ar.edu.unt.sigea.servicios.impl.GestorUsuariosImpl.repositorioMenu(GestorUsuariosImpl.java:0)
Possible dependencies:
- Managed Bean [class ar.edu.unt.sigea.repositorio.RepositorioMenu] with qualifiers [@Any @Default],
- Session bean [class ar.edu.unt.sigea.repositorio.RepositorioMenu with qualifiers [@Any @Default]; local interfaces are [RepositorioMenu]
...[Stack trace]...

Exception 0 :
org.jboss.weld.exceptions.DeploymentException: WELD-001409: Ambiguous dependencies for type RepositorioOperacion with qualifiers @Default
at injection point [BackedAnnotatedField] @Inject ar.edu.unt.sigea.repositorio.RepositorioMenu.repositorioOperacion
at ar.edu.unt.sigea.repositorio.RepositorioMenu.repositorioOperacion(RepositorioMenu.java:0)
Possible dependencies:
- Managed Bean [class ar.edu.unt.sigea.repositorio.RepositorioOperacion] with qualifiers [@Any @Default],
- Session bean [class ar.edu.unt.sigea.repositorio.RepositorioOperacion with qualifiers [@Any @Default]; local interfaces are [RepositorioOperacion]
(顺便说一句,我不知道为什么它说 3 exceptions 并且都显示为 Exception 0 )
参与类(class)
@Stateless
public class GestorPersonasImpl implements GestorPersonas {

@Inject
private GestorUsuarios gestorUsuarios;

public GestorUsuarios getGestorUsuarios() {return gestorUsuarios;}

public void setGestorUsuarios(GestorUsuarios gestorUsuarios) {
this.gestorUsuarios = gestorUsuarios;
}
// Other fields and methods
}

@Stateless
public class GestorUsuariosImpl implements GestorUsuarios {

@Inject
private RepositorioMenu repositorioMenu;

public RepositorioMenu getRepositorioMenu() {return repositorioMenu;}

public void setRepositorioMenu(RepositorioMenu repositorioMenu) {
this.repositorioMenu = repositorioMenu;
}
// Other fields and methods
}

@Stateless
@LocalBean
public class RepositorioMenu extends RepositorioGenerico<Menu> {

@Inject
private RepositorioOperacion repositorioOperacion;

public RepositorioOperacion getRepositorioOperacion() {return repositorioOperacion;}

public void setRepositorioOperacion(RepositorioOperacion repositorioOperacion) {
this.repositorioOperacion = repositorioOperacion;
}
// Other fields and methods
}

@Dependent
@Stateless
@LocalBean
public class RepositorioOperacion extends RepositorioGenerico<Operacion> {
// This class doesn't have injection points
// just put it here for the reference made in the error message
}
父类 RepositorioGenerico<Menu>只是一个具有一些通用方法与数据库交互的类和 Menu是一个实体类。接口(interface)如下:
@Local
public interface GestorPersonas {
// methods definitions, implemented by GestorPersonasImpl
}

@Local
public interface GestorUsuarios {
// methods definitions, implemented by GestorUsuariosImpl
}
每个注入(inject)点我只有一个可注入(inject)类,所以我不明白为什么注入(inject)失败。我不知道是否需要有关我的代码的更多详细信息,所以问我,我会编辑帖子;我只写我认为需要的部分。
我看过另一个帖子,但有 @Produces使用了注释,AFAIK,在这种情况下我不需要它。
任何帮助或指导表示赞赏。提前感谢您的回答
编辑 1
我在一篇文章中读到 Antonio GoncalvesJava Magazine CDI 是通过属性(甚至是私有(private)的)、setter 方法或构造函数创建的。考虑到这一点,我删除了每个注入(inject)属性的 getter 和 setter,并为这些属性设置了对默认(包)的访问。
注入(inject)属性的 getter/setter 方法仅用于在我的单元测试中手动设置依赖项,因此在生产中不需要它们。
在所有这些更改之后,错误仍然存​​在......
更多信息
根据 Java EE 7 official documentation ,我的 bean 符合 CDI Managed Bean 定义,除了点

It is not annotated with an EJB component-defining annotation or declared as an EJB bean class in ejb-jar.xml.


根据 javax.ejb javadoc EJB 组件定义注释是以下之一: @MessageDriven , @Stateful , @Stateless@Singleton .但是我见过其他使用 CDI 的项目使用 EJB(例如, @Stateless bean 被注入(inject)到其他地方)。另一方面,我一直在阅读 Beginning Java EE 7 by Antonio Goncalves那里说(第 2 章 - 上下文和依赖注入(inject)):

Anatomy of a CDI Bean

According to the CDI 1.1 specification, the container treats any class that satisfies the following conditions as a CDI Bean:

  • It is not a non-static inner class,
  • It is a concrete class, or is annotated @Decorator, and
  • It has a default constructor with no parameters, or it declares a constructor annotated @Inject.

Then a bean can have an optional scope, an optional EL name, a set of interceptor bindings, and an optional life-cycle management.


我的 bean 符合该定义。我查了 Weld Documentationchapter 2带来了 CDI bean 的定义,它更接近于第一个定义(来自 Java EE 文档)。问题是,正如我所说,我已经看到其他项目使用 EJB 托管 Bean( @Stateless 或其他)进行依赖注入(inject)。
总之,我不知道该相信谁。有人可以在这件事上有所了解吗?
尝试失败
注意:在此尝试之后,我在不同的地方遇到了同样的问题,因此服务器日志和所涉及的类与上述不同,请检查差异。
首先,根据预感,我向需要在其他地方注入(inject)的 bean 添加了接口(interface)。
其次,我更新了我的 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]
我不知道这是否会导致注入(inject)点出现错误,但听起来很可疑(而且我不知道如何更改)。它也出现在第一次尝试中,但正如我所说,它从未引起我的注意。现在日志和类
服务器日志
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]...
参与类(class)
@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
}
注入(inject)的字段显示在主要部分中。
感谢您为我提供此新信息的任何帮助。如果您需要有关该应用程序的更多信息,请告诉我。
提前感谢您的回答。

最佳答案

颠倒互联网2周后,我终于尝试部署在上野蝇 10.0.0 服务器,现在我的应用程序部署没有问题。所以我必须得出结论,这是 Glassfish 上的一个错误。 Pitty,因为我使用的是最新版本(4.1.1),它是基本的(我认为)作为 CDI 发现。希望Payara解决了这个问题,但我现在不会尝试。

我必须说:如果一个服务器被认为是“Java EE 7 兼容的”,那么它不应该被发布这种错误。

如果有人知道讨论论坛或知道不同服务器的一些基准测试结果,请将其注释掉。 为你感到羞耻 Glassfish

关于java - Glassfish 4.1 CDI WELD-001409 : Ambiguous dependencies,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38003014/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com