【发布时间】:2017-03-24 16:34:46
【问题描述】:
我们正在尝试为部署在 Wildfly 10.1.0 服务器上的集成测试套件使用替代 bean 实例注入。
根据 CDI 1.2 规范,一个可能的解决方案是在仅部署在集成测试存档中的替代方案上使用 @Specializes 注释。
但是,始终注入默认实现。我们在托管 bean、会话 bean 上尝试了 @Specializes,并尝试在 beans.xml 文件中选择替代方案。
下面的例子说明了这个问题:
BeanInterface.java
public interface BeanInterface {
void work();
}
Implementation1.java
@Dependent
public class Implementation1 implements BeanInterface {
@Override
public void work() {
System.out.println("test 1");
}
}
实施2
@Dependent
@Alternative
@Specializes
public class Implementation2 extends Implementation1 {
@Override
public void work() {
System.out.println("test 2");
}
}
TestSingleton.java:
@Singleton
@Startup
public class TestSingleton {
@Inject
private BeanInterface beanInterface;
@PostConstruct
public void init() {
this.beanInterface.work();
}
}
将这些类打包在一个war中(使用web.xml)并部署在wildfly上,实现1总是注入到Stateless bean中。
Wildfly 10.1.0 使用执行 CDI 1.2 的weld-2.3.SP2。
谢谢,
查理
【问题讨论】:
-
您是否在 beans.xml 中声明了您的 bean 作为替代品?你把它放在哪里了?在 webapp/WEB-INF 中?你需要什么 web.xml?
-
另外,所有这些都是直接部署到 WAR 中的,还是涉及到任何内部库 JAR?请注意,您可以通过
@Priority自动激活替代方案 -
感谢 John - 在 Implementation2 上使用 @Priority 可以按预期工作。我们在某个时候尝试过,但没有成功,可能还有别的东西。 Rouliboy:我的意思是 beans.xml,而不是 web.xml。 beans.xml 为空,bean-discovery-mode="all"。
-
@cghislai :如果您的 beans.xml 为空,则
@Alternativebean 未启用。您必须启用它。 -
@rouliboy:还有其他方法可以选择替代方案。根据最近的规范,beans.xml 甚至在理论上都不是必需的。
标签: cdi java-ee-7 wildfly-10