java - 替代 CDI 注入(inject)未按预期工作

标签 java cdi jboss7.x

我有两个实现接口(interface)的类。其中一个被注释为 @Default@Named。另一个注释为@Alternative

@Default
@Named
public class ListService implements IListService {
    @Override
    public void doSomething()
       print("default");
    }
}

@Alternative
public class ListServiceMock extends BaseServiceMock implements IListService {
    @Override
    public void doSomething()
       print("mock");
    }

}

注入(inject)是这样发生的:

public class SomeNavigator extends AbstractNavigator {

    private IListService listService;

    @Inject
    public SomeNavigator(IListService listService) {
        this.listService = listService;
    }

    public void doNavigate() {
       this.listService.doSomething(); // Always prints "mock"
    }
}

我的 beans.xml 文件位于/src/main/webapp/WEB-INF/beans.xml 中,该项目由 Maven 构建并打包为 war 文件并部署到 JBoss EAP 6.3.3.GA(在 Docker 容器中)

我相信,如果我将替代 bean ListServiceMock 包含在 beans.xml 文件中,则才会被注入(inject),如下所示:

<?xml version="1.0"?>
<beans bean-discovery-mode="all" version="1.1"
    xmlns="http://xmlns.jcp.org/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:weld="http://jboss.org/schema/weld/beans"
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
                     http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd">

    <alternatives>
        <class>service.alternative.ListServiceMock</class>
    </alternatives>
</beans>

但是,无论该部分是否在 beans.xml 中,始终使用替代 bean。

在这种情况下,beans.xml 文件似乎被忽略,并且始终选择替代 bean 进行注入(inject),这是否有原因?

最佳答案

似乎与 beans.xml 文件中的 XML 命名空间相关。我切换到这些命名空间,它现在可以工作了。

<beans xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="
      http://java.sun.com/xml/ns/javaee 
      http://java.sun.com/xml/ns/javaee/beans_1_0.xsd">

关于java - 替代 CDI 注入(inject)未按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56564403/

相关文章:

jboss 7 standalone-full.xml 作为配置

java - Spring 从 JBoss 上下文加载 PropertySourcesPlaceholderConfigurer

java - Nginx SSL 终止代理到 tomcat 8

java - 轻量级、可折叠的 Executor 实现?

jsf-2 - 删除/销毁 session 范围的 CDI 托管 bean

java - 将@Produces 与@Qualifier 一起使用

java - X509 RSA bouncy caSTLe 在 Java 中签署和验证纯文本

java - 即使使用@Fetch(FetchMode.JOIN),JPA + Hibernate 也会出现太多查询问题

java - Java EE 中的 CDI - 哪些 Java 类不能注入(inject)?

java - REST 身份验证 : CDI safe? CDI @Produces 的哪个范围?