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

Java 迁移到JBoss EAP 7后未找到按注释选择的CDI实例,java,maven,jboss,cdi,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 = findIn

我在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);
AbstractPositiveMessageApper
在其链中的某处实现了
MessageMapper

我以前在JBoss EAP 6.4.10中使用过这个,但现在在JBoss EAP 7.0.3中,它突然变得不令人满意了。我错过了什么?这是一个错误,它以前工作过吗?先谢谢你

编辑

我已经开始使用BeanManager来探索更多正在发生的事情。这就在
实例前面。选择

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);
    }
}

Set从CDI1.0到CDI1.1的一个显著变化是如何发现bean。新的默认设置是只发现带注释的bean

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

  • @Dependent
    注释添加到所需的bean中
  • beans.xml


要了解更多详细信息,您可能需要查看

从cdi 1.0到cdi 1.1的一个重要变化是如何发现bean。新的默认设置是只发现带注释的bean

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

  • @Dependent
    注释添加到所需的bean中
  • beans.xml


有关更多详细信息,请查看

谢谢您的回复。我以前也读过这方面的文章,在我之前的一个测试中使用了@Dependent注释,但没有任何帮助。我现在还尝试将protocol-v4的bean发现模式更改为all,但它仍然无法使用实例上的
select
找到bean。感谢您的回复。我以前也读过这方面的文章,在我之前的一个测试中使用了@Dependent注释,但没有任何帮助。我现在还尝试将protocol-v4的bean发现模式更改为all,但它仍然无法使用实例上的
select
找到bean。
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);
    }
}