Проблемы с CDI при введении универсального типа: Wildfly 8.2.0.Final

Мы сталкиваемся со странными проблемами внедрения в Widfly из-за изменений CDI. У нас есть интерфейс

public interface Command<I, O> {
}

и многие классы реализуют этот интерфейс следующим образом

public class ApproveUserRequests implements Command<ApproveUserRequestsRequest, List<String>> {
}

Классы прослушивателя приложений любят получать список всех доступных классов и используют инъекцию, подобную этой.

@Inject
private Instance<Command<I, O>> mActions;

Однако экземпляр, возвращаемый mActions, всегда был нулевым. После отладки исходный код обнаружил, что единственный способ получить список всех экземпляров — использовать

@Inject
private Instance<Command<?, ?>> mActions;

Также мы столкнулись с проблемами внедрения при использовании универсальных типов, однако нам помогло использование подстановочного знака. – Подробнее см. на странице: https://developer.jboss.org/thread/256783#sthash.1s6tuXsR.dpuf


person Srivathsan    schedule 05.05.2015    source источник
comment
Пожалуйста, пометьте код, сделав отступ в 4 пробела или заключив его в обратные галочки. Таким образом, вы избегаете проблем с кодом, который после публикации выходит неправильным и забавным. Также ваши две инъекции выглядят одинаково, вторая, кажется, не делает ничего другого?   -  person YoYo    schedule 05.05.2015
comment
Принято к сведению. Второй отличается, мы используем поиск по подстановочным знакам (?,?). первый использует ‹I,O›.   -  person Srivathsan    schedule 05.05.2015
comment
Подстановочный знак имеет смысл, что предыдущая версия. Подстановочный знак в дженериках означает любой тип, поэтому, если вам нужны все типы, используйте дженерики любого типа. Я просто не вижу тут ничего странного. Ожидаемое поведение   -  person maress    schedule 05.05.2015
comment
Верно, но этот подстановочный знак может дать вам любой тип, но я не понимаю, почему инъекция типа Command‹I,O› не работает. Существует много классов, реализующих Command‹I,O›. Обратите внимание, что раньше это работало в Jboss 7.1.1, в котором используется спецификация CDI 1.1 и более ранняя версия WELD. Я не уверен, что изменилось в новой версии WELD и CDI 1.2 в wildfly 8.2.0.Final.   -  person Srivathsan    schedule 05.05.2015
comment
В вашем вопросе отсутствует контекст: Instance<Command<I,O>> с несвязанными переменными типа даже не скомпилируется.   -  person Harald Wellmann    schedule 05.05.2015
comment
открытый класс ApplicationListener‹I, O› реализует ServletContextListener { private static final String PREFIX = com.collabnet.ctf.saturn.client.apps.; @Inject private Instance‹Command‹?, ?›› mActions;   -  person Srivathsan    schedule 08.05.2015


Ответы (1)


Правила для параметризованных типов были уточнены в CDI 1.2. Посмотрите Раздел 5.2.4 Присваиваемость необработанных и параметризованных типов спец.

person Harald Wellmann    schedule 05.05.2015
comment
Не могли бы вы добавить в свой ответ код, который устраняет указанную выше проблему? - person Jan Galinski; 05.05.2015
comment
Я думаю, docs.jboss.org/cdi/spec/1.2/ cdi-spec.html#assignable_parameters предоставляет некоторую информацию. В моем случае требуемый параметр типа — переменная типа (I) и (O), а параметр типа компонента — фактический тип ApproveUserRequestsRequest, List‹String›. Согласно спецификации закачка невозможна, не удовлетворяет ни одному из пяти условий, указанных в разделе 5.2.4. Изменение на подстановочный знак ?, ? делает свое дело. Обратите внимание, что rawtypes в данном случае — это класс Command. - person Srivathsan; 08.05.2015