【问题标题】:WELD-001409: Ambiguous dependencies for type T with qualifiers @DefaultWELD-001409:带有限定符 @Default 的类型 T 的模棱两可的依赖关系
【发布时间】:2017-08-14 14:10:14
【问题描述】:

我有 2 个豆子。

第一个是我在生产中使用的模型,Model

@Named("model")
@RequestScoped
public class Model{

}

第二个是我用于测试的Model的扩展。

@Named("modelTest")
@RequestScoped
public class ModelTest extends Model{

}

如何强制 CDI 默认选择 Model

【问题讨论】:

  • 一个测试不应该扩展它测试的类。
  • 它不是一个junit测试。它是一个不同的测试。 Web 组件的自定义测试。但这不重要。因为如果我只是有两个接口的实现,就会出现这个问题。
  • 例如,这里不需要限定符。

标签: java jakarta-ee cdi subclassing weld


【解决方案1】:

由于您想更改给定类型的“默认”bean,并且您不想使用限定符,我假设原始 bean 不会被注入任何地方。因此,您可能追求的是替代品或专业化。

如果我们谈论 alternatives,您需要使用 @Alternative 注释标记新 bean 并“选择”它 - 这可以在 beans.xml 中基于每个 bean 存档完成,或者只需在全球范围内使用@Priority(int)。这是一个代码sn-p:

@Named("modelTest")
@RequestScoped
@Alternative
@Priority(1) // "activates"/selects the alternative
public class ModelTest extends Model{
}

使用选定的替代方案,每当您注入前一个类型 (Model) 时,CDI 将改为注入此替代方案 (ModelTest),因为它也适合注入点。

次要选项是专业化。它与替代方案非常相似,但在原始 bean 被“丢弃”的方式上更为严格,您可以在CDI spec 中阅读更多相关信息。专业化还带有限定符和 bean 名称继承(不是范围!)。也不需要选择 bean(而不是替代品)。代码如下:

@RequestScoped
@Specializes
public class ModelTest extends Model{
  // bean name with be inherited automatically as "model"
}

请注意,根据规范,一个 bean 一次只能有一个 bean 名称。因此,如果您继承一个名称并声明另一个名称,您将收到错误 - 相应地更改您的代码。

【讨论】:

    猜你喜欢
    • 2019-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 2017-08-28
    • 1970-01-01
    • 1970-01-01
    • 2015-06-10
    相关资源
    最近更新 更多