CDI/WELD может ли пользовательский классификатор работать в сочетании с аннотацией @Named?
Имея пользовательский квалификатор для поддержки CDI, как указано ниже:
@Qualifier
@Retention(RUNTIME)
@Target({METHOD, FIELD, PARAMETER, TYPE})
public @interface QualifiedFooBean {
}
@QualifiedFooBean
public class FooBean implements ImplFooBean {
}
public interface ImplFooBean {
}
Я хотел бы связать FooBean #{fooBean} напрямую, не требуя оболочки или процессора (видно из этого примера). Аннотация "Named" (в классе FooBean), кажется, не работает для моего макета класса.
Мое решение (без оболочки), которое мне интересно, почему оно не работает и не вызывает: Target Unreachable, идентификатор 'fooBean' преобразован в ноль
@Named
@QualifiedFooBean
public class FooBean implements ImplFooBean {
}
У кого-нибудь есть идеи?
2 ответа
Обертка не нужна. Мое решение совершенно правильно. Также разрешено добавлять Named в сочетании с пользовательским классификатором (в моем случае QualifiedFooBean). Мне нужно было просто создать пустой файл beans.xml в папке WEB-INF, чтобы заставить CDI работать. Во всяком случае, сам вопрос объясняет, как могут работать пользовательские классификаторы. Вы также можете предварительно заполнить beans.xml следующим содержимым:
<beans xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/beans_1_0.xsd">
</beans>
Он послужит каркасом для будущего использования, если вам нужно настроить более модные вещи с помощью CDI.
Добавление @Named
к вашему бобу должен работать: он работает для меня.
На самом деле @Named - это спецификатор, когда JSF разрешает Бин для отображения, он делает lokup на основе @Named
Классификатор. В CDI бин обнаруживается, если сторона поиска (т. Е. Точка инъекции) запрашивает подмножество своего классификатора.
Например, боб квалифицируется так:
@QualifiedFooBean
@SecondQualifier
public class FooBean {}
Будет найден (если нет неоднозначного разрешения)
@Inject
@SecondQualifier
FooBean bean;
или даже:
@Inject
FooBean bean;
Но не
@Inject
@SecondQualifier
@ThirdQualifier
FooBean bean;
Таким образом, вы можете добавить @Named
определитель и пусть механизм разрешения CDI сделает свое дело.