我们正在尝试为部署在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");
}
}
Implementation2
@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();
}
}
将这些类打包在战争中(使用web.xml)并在wildfly上部署,实现1始终注入无状态bean。
Wildfly 10.1.0使用了焊接2.3.SP2,它实现了CDI 1.2。
谢谢,
查理
答案 0 :(得分:0)
虽然它没有使@Specializes注释按预期工作,但John Ament建议的这个解决方案允许注入第二个实现。
只需使用@ javax.annotation.Priority(和某个值)更改@ javax.enterprise.inject.Specializes注释:
@Dependent
@Alternative
@Priority(100)
public class Implementation2 extends Implementation1 {
@Override
public void work() {
System.out.println("test 2");
}
}
OP问题中还缺少在WEB-INF中打包的beans.xml(不是web.xml):
<?xml version="1.0" encoding="UTF-8"?>
<beans
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd"
bean-discovery-mode="all">
</beans>