【问题标题】:CDI: Ambiguous dependencies with only one producerCDI:只有一个生产者的模棱两可的依赖关系
【发布时间】:2017-08-11 08:55:55
【问题描述】:

我在尝试部署 Web 应用程序时遇到这些错误:

在注入点 [BackedAnnotatedField] 带有限定符 @Default\n 的 AuthzInfo 类型的模糊依赖项

可能的依赖关系:\n - 生产者方法 [AuthzInfo] 带有限定符 [@Any @Default] 声明为 [[BackedAnnotatedMethod] @Produces @RequestScoped

我只创建了一个这样的生产者:

@Produces @RequestScoped
public AuthzInfo getAuthzInfo(@Context HttpServletRequest httpRequest) 
    //...
}

我正在使用 @Inject annotation:

@Inject private AuthzInfo authzInfo;

但是,我创建了一个@CurrentUser 注释,并使用此注释标记了@Producer @CurrentUser@Inject @CurrentUser。问题已经解决了。

为什么我需要使用这个解决方法?只有一个生产者生产AuthInfo 对象。

【问题讨论】:

    标签: jakarta-ee cdi


    【解决方案1】:

    您的 producer 方法返回 AuthzInfoAuthzInfo 本身是一个 CDI 托管 bean。这就是为什么它是模棱两可的,在这种情况下需要一个限定符。


    您可能在您的beans.xml 中使用bean-discovery-mode="all"

    如果您更改为bean-discovery-mode="annotated" (default in CDI 1.2 and no beans.xml is required),则只会发现具有 bean 定义注释的类,而忽略所有其他类:

    2.5.1. Bean defining annotations

    一个 bean 类可能有一个 bean 定义注解,允许它被 放置在应用程序中的任何位置,如Bean Archives 中所定义。一颗豆子 带有定义注解的 bean 的类被称为隐式 bean。

    定义注解的bean集合包含:

    • @ApplicationScoped@SessionScoped@ConversationScoped@RequestScoped注解,

    • 所有其他普通范围类型,

    • @Interceptor@Decorator 注释,

    • 所有原型注解(即用 @Stereotype),

    • @Dependent 范围注释。

    【讨论】:

    • 感谢您的方法。它有道理。但是,我没有任何beans.xml
    • @Jordi 所以你使用的是 CDI 1.2?
    猜你喜欢
    • 2017-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-23
    • 1970-01-01
    • 2016-12-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多