我正在与其他文件一起在JBoss EAP 7.0.3上运行以下内容,以获取帮助:
common.jar
协议-v4.jar
在common.jar中,我有以下代码(部分):
MessageServiceImpl.java:
@Any
@Inject
private Instance<MessageMapper<M>> mappers; // M -> SimpleMessage
// ...
MessageMapper<M> mapper = findInstance(mappers, new MapperType.Literal(messageType, parameters.getProtocolVersion()), "message mapper");
// inside findInstance:
Instance<T> candidate = instance.select(annotationLiteral);
首先是结果:上面的
candidate
具有isUnsatisfied()为true。现在,该实现位于protocol-v4.jar内部:
@MapperType(messageType = MessageType.HANDSHAKE, version = Protocol.VERSION)
public class HandshakeMessageMapper extends AbstractPositiveMessageMapper {
AbstractPositiveMessageMapper
在其链中某处实现MessageMapper<SimpleMessage>
我曾经在JBoss EAP 6.4.10中使用此功能,但是现在对于JBoss EAP 7.0.3却突然不满意。我想念什么?这是以前使用过的错误吗?先感谢您。
编辑
我已经开始使用BeanManager来探索发生了什么。这是在
instance.select
之前:Set<Bean<?>> beans = beanManager.getBeans(Object.class, new AnnotationLiteral<Any>() {});
for(Bean<?> bean : beans) {
if(bean.getBeanClass().getName().contains("v104.mapper.Handshake")) {
for(Annotation annotation : bean.getQualifiers()) {
if(annotation.annotationType() == MapperType.class) {
MapperType mapper = (MapperType) annotation;
logger.info("Type: {}, Version: {}", mapper.messageType(), mapper.version());
} else {
logger.info("Qualifier: {}", annotation.annotationType());
}
}
logger.info("Bean: " + bean);
}
}
这可以正常工作,并将我的HandshakeMessageMapper显示为具有正确限定符(@Any和@MapperType(value&protocol))的bean。
但是,如果我将
getBeans
更改为:beanManager.getBeans(MessageMapper.class, new AnnotationLiteral<Any>() {});
,则找不到任何bean。因此出于某些原因,BeanManager
并不认为我的HandshakeMessageMapper
是可以提供接口MessageMapper
的bean。 最佳答案
从cdi 1.0到cdi 1.1的一个重大变化是如何发现豆。新的默认设置是仅发现带注释的bean。
因此,您有两种选择(我知道):
将@Dependent
批注添加到所需的bean。
在beans.xml
中将bean-discovery-mode设置为“ all”
<?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>
有关更多详细信息,您可能想查看https://blogs.oracle.com/theaquarium/entry/default_cdi_enablement_in_java