WELD-001409:带有限定符@Default的类型T的模糊依赖关系

时间:2017-08-14 14:10:15

标签: java java-ee cdi subclassing weld

我有2个豆子。

第一个是我在制作中使用的模型Model

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

}

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

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

}

如何强制CDI默认选择Model

1 个答案:

答案 0 :(得分:2)

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

如果我们谈论替代,您需要使用@Alternative注释标记新bean并“选择”它 - 可以在{{基于每个bean存档的基础上完成1}}或仅使用beans.xml全局。这是一段代码:

@Priority(int)

使用选定的替代方案,无论何时注入先前的类型(@Named("modelTest") @RequestScoped @Alternative @Priority(1) // "activates"/selects the alternative public class ModelTest extends Model{ } ),CDI都会注入此替代方法(Model),因为它也适合注入点。

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

ModelTest

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