java - 迁移到 JBoss EAP 7 后找不到通过注释选择 CDI 实例

标签 java maven jboss cdi

我有一个在 JBoss EAP 7.0.3 上运行的ear文件,其中包含(除其他外)以下内容: 公共(public)jar 协议(protocol)-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 & protocol))。

但是如果我更改 getBeans至:beanManager.getBeans(MessageMapper.class, new AnnotationLiteral<Any>() {});找不到 bean 。因此由于某种原因 BeanManager不考虑我的HandshakeMessageMapper成为一个可以提供接口(interface)的bean MessageMapper

最佳答案

从 cdi 1.0 到 cdi 1.1 的一个显着变化是 Bean 的发现方式。新的默认设置是仅发现带注释的 bean。

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

  • 向您想要的 Bean 添加 @Dependent 注释。
  • 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

关于java - 迁移到 JBoss EAP 7 后找不到通过注释选择 CDI 实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41699431/

相关文章:

java - 如何在 IntelliJ 中运行 Java .jar 文件?错误 - 参数 : archive-name [archive-type]

unit-testing - 如何在 Jersey 单元测试框架 2.5 中设置 Servlet 上下文

java - 我正在创建一个 Maven 项目并且我是初学者..我收到了这个错误。可以帮助解决这是我的 pom.xml & web.xml

java - 类加载器的输入流已损坏

java - JDBI 没有映射器注册

java - 使用 UTF-8 将 Java 对象序列化为字符串

java - 如何在 Spring Rest Call 中使用 GridFS 从 Mongodb 发送和检索图像?

java - JDBC 返回空结果集

java - ServletContext.getRealPath ("pictures") 返回 tmp 目录??老板

java - 使用已知但不可访问的 wsdl 创建 Web 服务客户端