WELD-001409:带有限定符 @Default 的类型 T 的依赖性不明确
WELD-001409: Ambiguous dependencies for type T with qualifiers @Default
我得到了 2 个豆子。
第一个是我在生产中使用的模型,Model
。
@Named("model")
@RequestScoped
public class Model{
}
第二个是我用来测试的 Model
的扩展。
@Named("modelTest")
@RequestScoped
public class ModelTest extends Model{
}
如何强制 CDI 默认为 select Model
?
因为您想更改给定类型的 'default' bean 并且您不想使用限定符,所以我假设原始 bean 不会被注入到任何地方。因此,您可能追求的是 替代或专业化。
如果我们谈论 替代方案 ,您需要使用 @Alternative
注释标记新 bean 并 'select' 它 - 这可以在beans.xml
中的每个 bean 存档基础或简单地使用 @Priority(int)
全局。这是一个代码片段:
@Named("modelTest")
@RequestScoped
@Alternative
@Priority(1) // "activates"/selects the alternative
public class ModelTest extends Model{
}
使用 selected 替代方案,无论何时注入前一种类型 (Model
),CDI 都会注入该替代方案 (ModelTest
),因为它适合注入点嗯。
第二选择是专业化。它与替代品非常相似,但原始 bean 是 'discarded' 的方式更严格,您可以在 CDI spec 中阅读更多相关信息。专业化还带有限定符和 bean 名称继承(但不是作用域!)。也没有必要 select bean(与替代品相反)。这是代码:
@RequestScoped
@Specializes
public class ModelTest extends Model{
// bean name with be inherited automatically as "model"
}
请注意,根据规范,一个 bean 一次只能有一个 bean 名称。因此,如果您继承一个名称并声明另一个名称,您将收到错误 - 相应地更改您的代码。
我得到了 2 个豆子。
第一个是我在生产中使用的模型,Model
。
@Named("model")
@RequestScoped
public class Model{
}
第二个是我用来测试的 Model
的扩展。
@Named("modelTest")
@RequestScoped
public class ModelTest extends Model{
}
如何强制 CDI 默认为 select Model
?
因为您想更改给定类型的 'default' bean 并且您不想使用限定符,所以我假设原始 bean 不会被注入到任何地方。因此,您可能追求的是 替代或专业化。
如果我们谈论 替代方案 ,您需要使用 @Alternative
注释标记新 bean 并 'select' 它 - 这可以在beans.xml
中的每个 bean 存档基础或简单地使用 @Priority(int)
全局。这是一个代码片段:
@Named("modelTest")
@RequestScoped
@Alternative
@Priority(1) // "activates"/selects the alternative
public class ModelTest extends Model{
}
使用 selected 替代方案,无论何时注入前一种类型 (Model
),CDI 都会注入该替代方案 (ModelTest
),因为它适合注入点嗯。
第二选择是专业化。它与替代品非常相似,但原始 bean 是 'discarded' 的方式更严格,您可以在 CDI spec 中阅读更多相关信息。专业化还带有限定符和 bean 名称继承(但不是作用域!)。也没有必要 select bean(与替代品相反)。这是代码:
@RequestScoped
@Specializes
public class ModelTest extends Model{
// bean name with be inherited automatically as "model"
}
请注意,根据规范,一个 bean 一次只能有一个 bean 名称。因此,如果您继承一个名称并声明另一个名称,您将收到错误 - 相应地更改您的代码。