Компонент JSF и CDI с областью просмотра

Я использую Java EE 6 на JBoss EAP 6, и мои JSF-бины аннотированы следующим образом: @ManagedBean @ViewScoped (оба из пакета javax.faces.bean)

Однако они также являются компонентами CDI (конструктор по умолчанию, использование @Inject, @PreDestroy и т. д.). Я все время читаю, что вы не можете смешивать эти аннотации (JSF и CDI), но, по-видимому, работает нормально: инъекции работают, preDestroy вызывается при изменении вида и т. д.).

Я что-то упускаю? В чем проблема? Почему бы не использовать?


person htft    schedule 24.09.2013    source источник


Ответы (1)


CDI @Inject работает «везде», а значит, и внутри JSF @ManagedBean. Аналог JSF @ManagedProperty работает только внутри @ManagedBean. Вы также не можете @Inject использовать настоящий управляемый компонент JSF в любом управляемом компоненте CDI (вместо этого это будет управляемый экземпляр CDI). Возможно, это то, о чем вы читали. Однако общее мнение состоит в том, что желательно не смешивать их, чтобы избежать путаницы среди начинающих. библиотека утилит JSF OmniFaces имеет CDI-совместимый @ViewScoped для JSF 2.0/2.1.

Кстати, @PreDestroy не специфичен для CDI, равно как и его аналог @PostConstruct. Они должны нормально работать как в управляемых компонентах CDI, так и в управляемых компонентах JSF.

person BalusC    schedule 24.09.2013
comment
Спасибо за ответ. Кажется, я действительно запутался во всех этих вещах... Итак, у меня есть управляемый компонент JSF, а не компонент CDI? Даже если этот bean-компонент соответствует всем требованиям, будет ли документация CDI-компонента говорить о нем (конструктор по умолчанию, а не внутренний класс и т. д.)? Если да, то какая разница с компонентом CDI? каковы недостатки или что я не могу сделать с этим компонентом, который я могу сделать с компонентом CDI? - person htft; 24.09.2013
comment
Вы не можете @Inject использовать экземпляр управляемого компонента JSF в другом месте. Если вам это на самом деле не нужно, то в этом нет особого недостатка. Но следует отметить, что JSF медленно переходит на CDI. Предстоящие новые аннотации JSF, такие как @FlowScoped, предназначены только для CDI. Средство JSF @ManagedBean будет объявлено устаревшим в ближайшем будущем. Пользователям рекомендуется перейти на CDI до того, как это произойдет. - person BalusC; 24.09.2013