2015-05-05 5 views
0

Мы сталкиваемся с необычными проблемами впрыска в Widfly из-за изменений CDI. Мы имеем интерфейсПроблемы с CDI при инъекции родового типа: Wildfly 8.2.0.Final

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

+0

Пожалуйста, отметьте свой код с помощью отступов или пробелов в 4 пробела или в виде обратных тиков. Таким образом, вы избегаете проблем с кодом, который выходит неправильно и смешно, когда-то размещался. Также ваши две инъекции выглядят одинаково, а вторая, похоже, не делает ничего другого? – YoYo

+0

Отмечено. Второй - другой, мы используем подстановочный поиск (?,?). первый использует . – Srivathsan

+0

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

ответ

1

Правила для параметризованных типов были уточнены в CDI 1.2. Посмотрите на Section 5.2.4 Assignability of raw and parameterized types спецификации.

+0

Не могли бы вы добавить код, который устраняет проблему выше, на ваш ответ? –

+0

Я думаю, http://docs.jboss.org/cdi/spec/1.2/cdi-spec.html#assignable_parameters предоставляет некоторую информацию. В моем случае требуемым параметром типа являются переменные типа (I) и (O), а тип типа bean - фактический тип ApproveUserRequestsRequest, List . В соответствии с инъекцией спекания невозможно, не удовлетворяет ни одному из пяти условий, упомянутых в разделе 5.2.4. Переход на подстановочные знаки «?», «?» делает трюк. Примечание: rawtypes в этом случае является классом Command – Srivathsan

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

  • Нет связанных вопросов^_^