Env:
Wildfly 9.0.1
Weld 2.2.14
按照CDI规范和@Specializes的工作方式,在我看来@Specializes bean只能替换' a 'bean /实现而不是' some '豆/实现。
鉴于接口和限定符提供的灵活性,我发现这很奇怪。
让我通过示例代码给出方案:
Bean类:
interface Animal {
public String getName();
}
@Siamese
public class Cat implements Animal {
@Override
public String getName() {
return "Siamese";
}
}
@Labrador
public class Dog implements Animal {
@Override
public String getName() {
return "Labrador";
}
}
注射点:
@Siamese
@Inject
private Animal cat;
@Labrador
@Inject
private Animal dog;
鉴于代码,我的目的是提供一个@Specializes模拟bean,它可以注入上面列出的两个注入点。这是模拟bean
@Alternative
@Specializes
public class MockAnimal implements Animal {
@Override
public String getName() {
return "Mock Animal";
}
}
但这似乎是不可能的,因为MockBean必须“扩展”它需要专门化的任何bean。
想要和你们一起检查一下除了创建MockDog和MockCat之外是否有其他工作。
提前致谢,
勒凯什
答案 0 :(得分:0)
通常,您想要使用的只有@Alternative
而没有@Specializes
,并添加您希望注入bean的所有限定符。只有当您希望新bean完全覆盖旧bean而不复制其限定符时,甚至对于使用@Specializes
注释的注入点时,才需要@Any
。
您的解决方案就是:
@Alternative
@Labrador
@Siamese
public class MockAnimal implements Animal {
@Override
public String getName() {
return "Mock Animal";
}
}
唯一不会覆盖Cat
和Dog
bean的注入点将是@Any
的注入点,如下所示:
@Any
Instace<Animal> allAnimals;
这将列出Animal的所有3个实现,即使启用了替代方案。但似乎这不是你的担忧。