迁移到JBoss EAP 7后找不到注释的CDI实例选择

时间:2017-01-17 14:15:59

标签: java maven jboss cdi

我正在使用(及其他)以下内容在JBoss EAP 7.0.3上运行的ear文件: 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显示为具有正确限定符的bean(@Any和@MapperType(value&amp; protocol))。

但是,如果我将getBeans更改为:beanManager.getBeans(MessageMapper.class, new AnnotationLiteral<Any>() {});,则无法找到任何bean。因此,由于某些原因,BeanManager不认为我的HandshakeMessageMapper是一个可以提供接口的MessageMapper

1 个答案:

答案 0 :(得分:1)

从cdi 1.0到cdi 1.1的一个重大变化是如何发现豆类。新的默认值是只发现带注释的bean。

所以你有两个选择(我知道):

  • @Dependent注释添加到您想要的bean中。
  • 将bean-discovery-mode设置为&#34; all&#34;在beans.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>

有关详细信息,您可能需要查看https://blogs.oracle.com/theaquarium/entry/default_cdi_enablement_in_java