2017-01-17 1 views
0

Я имею файл уха с (среди других) следующее содержание работает на JBoss EAP 7.0.3: common.jar протокола-v4.jarКДИ выбора экземпляра с помощью аннотации не найден после перехода на JBoss EAP 7

В 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() в действительности.

Теперь реализация находится внутри протокола-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 неожиданно неудовлетворен. Что мне не хватает? Это была ошибка, с которой раньше работала? Заранее спасибо.

EDIT

Я начал использовать 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 (значение & протокола)).

Если, однако, я изменяю getBeans на: beanManager.getBeans(MessageMapper.class, new AnnotationLiteral<Any>() {});, никакой фасоли не могут быть найдены. Так по какой-то причине BeanManager не считает мой HandshakeMessageMapper быть боб, который может предложить интерфейсной MessageMapper

ответ

1

одно существенное изменение от КДИ 1,0 до 1,1 CDi было, как бобы discoverd. Новое значение по умолчанию заключается в том, что обнаружены только аннотированные бобы.

Так у вас есть два варианта (я в курсе):

  • Добавить @Dependent аннотаций к бобам, которые вы хотите.
  • Установите боб-открытие-режим «все» в 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

+0

Спасибо за ваш ответ. Я также читал об этом раньше и использовал аннотацию @Dependent в одном из моих предыдущих тестов, что не помогло. Я также попытался изменить режим обнаружения бина для протокола-v4 для всех, но он все еще не может найти компонент, используя 'select' в экземпляре. –

Смежные вопросы