替代 CDI 注入未按预期工作
Alternative CDI injection not working as expected
我有两个 类 实现了一个接口。一个被注释为 @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");
}
}
注入是这样发生的:
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
文件中,如下所示:
<?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 总是 被选择用于注入是否有原因?
似乎与 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">
我有两个 类 实现了一个接口。一个被注释为 @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");
}
}
注入是这样发生的:
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
文件中,如下所示:
<?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 总是 被选择用于注入是否有原因?
似乎与 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">