@Specializes在Wildfly 10.1.0中

时间:2017-03-24 16:34:46

标签: cdi java-ee-7 wildfly-10

我们正在尝试为部署在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。

谢谢,

查理

1 个答案:

答案 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>