【问题标题】:@Specializes in Wildfly 10.1.0@专注于 Wildfly 10.1.0
【发布时间】: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 为空,则 @Alternative bean 未启用。您必须启用它。
  • @rouliboy:还有其他方法可以选择替代方案。根据最近的规范,beans.xml 甚至在理论上都不是必需的。

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


【解决方案1】:

虽然它不会使@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>

【讨论】:

    猜你喜欢
    • 2017-01-21
    • 2017-03-06
    • 2017-05-03
    • 2018-02-09
    • 2013-12-16
    • 1970-01-01
    • 1970-01-01
    • 2017-07-13
    • 1970-01-01
    相关资源
    最近更新 更多