jakarta-ee - 同一个 bean 中的两个生产者导致歧义错误

标签 jakarta-ee cdi

我正在学习 Java EE 中的 CDI 和不同的注释。我创建了一个 repo .我使用同一个托管 bean 来生成两个问候字符串。非正式和正式。我收到以下错误:

SEVERE:   Exception while loading the app : CDI deployment failure:WELD-001409 Ambiguous dependencies for type [String] with qualifiers [@Formal] at injection point [[BackedAnnotatedField] @Inject @Formal mypackage.HelloServlet.formalMessage]. Possible dependencies [[Producer Method [String] with qualifiers [@Formal @Any] declared as [[BackedAnnotatedMethod] @Produces @Formal public mypackage.ProduceFormalGreeting.GetFormalGreeting()], Producer Method [String] with qualifiers [@Formal @Any] declared as [[BackedAnnotatedMethod] @Produces @Formal public mypackage.ProduceGreeting.GetFormalGreeting()]]]
org.jboss.weld.exceptions.DeploymentException: WELD-001409 Ambiguous dependencies for type [String] with qualifiers [@Formal] at injection point [[BackedAnnotatedField] @Inject @Formal mypackage.HelloServlet.formalMessage]. Possible dependencies [[Producer Method [String] with qualifiers [@Formal @Any] declared as [[BackedAnnotatedMethod] @Produces @Formal public mypackage.ProduceFormalGreeting.GetFormalGreeting()], Producer Method [String] with qualifiers [@Formal @Any] declared as [[BackedAnnotatedMethod] @Produces @Formal public mypackage.ProduceGreeting.GetFormalGreeting()]]]
    at org.jboss.weld.bootstrap.Validator.validateInjectionPointForDeploymentProblems(Validator.java:406)

我不知道为什么当第一个函数用 Formal 注释而第二个函数用 Informal 注释时会有歧义。当我删除其中一个函数或将其移动到不同的 bean 类时,错误就会消失。谢谢
public class ProduceGreeting {

    @Produces
    @Formal
    public String GetFormalGreeting(){
        return "Good morning !";
    }

    @Produces
    @InFormal
    public String GetInFormalGreeting(){
        return "Hi there !";
    }
}

调用 ProduceGreeting 类的 Servlet:
@Inject
@Formal
String formalMessage;

@Inject
@InFormal
String informalMessage;
...
...

 out.println("<h2> Formal Greeting: " + formalMessage + "</h2>");
 out.println("<h2> Informal Greeting: " + informalMessage + "</h2>");

编辑 - 添加非正式和正式注释(也可在 repo 中找到)。
@Qualifier
@Retention(RUNTIME)
@Target({TYPE, METHOD, FIELD, PARAMETER})
public @interface Formal {}


@Qualifier
@Retention(RUNTIME)
@Target({TYPE, METHOD, FIELD, PARAMETER})
public @interface InFormal {}

最佳答案

错误消息说你有一个

mypackage.ProduceFormalGreeting.GetFormalGreeting()

方法和一个
mypackage.ProduceGreeting.GetFormalGreeting()

以及。我猜你需要清理 target删除旧类的目录(它可能在开发过程中被重命名)。 (代码很好,它适用于 Java SE。)

关于jakarta-ee - 同一个 bean 中的两个生产者导致歧义错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23615224/

相关文章:

java - 如何在没有页面请求的情况下自动调用 servlet/类/方法?

jakarta-ee - 如何创建可配置的 CDI Producer?

jsf - 更新了omnifaces jar,现在它说我的转换器不明确

jsf - WELD-001410 : The injection point has non-proxyable dependencies

jakarta-ee - CDI SessionScoped 托管 bean 中的 PostConstruct

maven - 在 WEB-INF/lib 内的 JAR 中找不到 CDI 实例

java - 在 websphere 中查找本地 EJB 的正确方法 - 获取 ClassCastException

java - 在哪里可以找到我可以在 JPA 中使用的属性名称?

java - 我可以在远程/本地接口(interface)中使用继承吗? (EJB3)

java - 字段上的 CDI @Produces 注释的目的是什么?