2017-08-14 110 views
0

我有2个bean。WELD-001409:类型T与限定符的模糊依赖关系@默认

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

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

} 

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

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

} 

如何强制CDI默认选择Model

+0

无论如何,测试不应该扩展它所测试的类。 – Tom

+0

它不是一个junit测试。它是一个不同的测试。 Web组件的自定义测试。但它不重要。因为如果我只有2个接口的实现,就会出现这个问题。 – user2914191

+1

看看[https://dzone.com/articles/java-ee6-cdi-named-components] – Egl

回答

1

既然你想改变给定类型的'默认'bean,并且你不想使用限定符,我假定原始bean不会被注入到任何地方。因此,你可能以后是替代或专业化。

如果我们谈论替代,你需要@Alternative标注来标记新豆还“选择”它 - 这可以在每一个bean档案基础上beans.xml完成或者干脆用全球@Priority(int)。下面的代码片段:

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

与选择的替代方案,只要你注入之前的类型(Model),CDI反而会注入这种替代(ModelTest),因为它适合注射点为好。

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

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

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