Вопрос

Я только что начал читать Core Javaserver Faces, 3RD. И они говорят это (упор мой):

Это историческая авария, что существует два отдельных механизма, фасоль CDI и JSF-бобы для бобов, которые можно использовать в страницах JSF. Предлагаем, что вы используете CDI Beans Если ваше приложение не должно работать на простых порна сервлета, такого как Tomcat.

Почему? Они не предоставляют Любые Обоснование. Я использовал @ManagedBean Для всех бобов в приложении прототипов работает на Glassfish 3, и я действительно не заметил какие-либо проблемы с этим. Я не особенно ум мигрирую из @ManagedBean к @Named, но я хочу знать Почему я должен беспокоить.

Это было полезно?

Решение

CDI предпочтительнее над простым JSF, потому что CDI обеспечивает инъекцию зависимости в зависимости от Javaee. Вы также можете вводить Pojos и позвольте им управлять. С JSF вы можете ввести только подмножество того, что вы можете с CDI.

Другие советы

Используйте CDI.

Согласно JSF 2.3, @ManagedBean является устаревший. Отказ Смотрите также Спецификация 1117.. Отказ Это означает, что больше нет причина выбрать @ManagedBean над @Named. Отказ Это было впервые реализовано в Mojarra 2.3.0 Beta Version M06.

enter image description here


История

Разница в основровав, @ManagedBean управляется JSF Framework и только через @ManagedProperty Доступно для другого JSF управляемых бобов. @Named управляется сервером приложений (контейнер) через CDI Framework и является через @Inject Доступно для любого вида контейнера, управляемого артефактом, как @WebListener, @WebFilter, @WebServlet, @Path, @Stateless, и т.д. и даже JSF @ManagedBean. Отказ С другой стороны, @ManagedProperty делает нет Работа внутри А. @Named Или любой другой контейнер управляемый артефакт. Это работает действительно только внутри @ManagedBean.

Еще одно отличие состоит в том, что CDI фактически впрыскивает прокси, делегирующие на текущий экземпляр в целевой области на основе каждого запроса / потока (вроде как EJBS, вводится). Этот механизм позволяет вводить боб более узкой массы в бобине более широкой массы, что невозможно с JSF @ManagedProperty. Отказ JSF «впрыскивает» здесь физический экземпляр непосредственно, вызывая установку (именно так, именно поэтому требуется установка, в то время как это нет требуется с @Inject).

Несмотря на невыгодное положение - есть и другие способы - объем @ManagedBean просто ограничен. С другой точки зрения, если вы не хотите разоблачать «слишком много» для @Inject, Вы также можете просто сохранить ваши управляемые бобы @ManagedBean. Отказ Это как protected против public. Отказ Но это на самом деле не считается.

По крайней мере, в JSF 2.0 / 2.1, основным недостатком управляющей бобов JSF Beeting CDI является то, что нет CDI, эквивалент @ViewScoped. Отказ То @ConversationScoped находит близко, но все еще требует вручную запускаться и останавливаться, и он добавляет уродливый cid Запросить параметр для результатов URL. MyFaces Codi облегчает полностью прозрачно соединение JSF javax.faces.bean.ViewScoped к CDI, чтобы вы могли просто сделать @Named @ViewScoped, Однако, однако это приносит уродливый windowId Запрос параметра для результатов URL-адресов, также на простой навигации Vanilla к странице к странице. Омнозащитные решает это все с помощью настоящих CDI @ViewScoped Что действительно связывает охват компонента бобов в состояние JSF, а не на произвольный параметр запроса.

JSF 2.2 (который выпущен через 3 года после этого вопроса / ответа) предлагает новый полностью совместимый CDI @ViewScoped Аннотация из коробки в аромате javax.faces.view.ViewScoped. Отказ JSF 2.2 даже приходит вместе с CDI-только @FlowScoped который не имеет @ManagedBean Эквивалентное, настоящее, нажимая пользователей JSF к CDI. Ожидание в том, что @ManagedBean и друзья будут устарены в соответствии с Java EE 8. Если вы в настоящее время все еще используете @ManagedBean, Поэтому, следовательно, настоятельно рекомендуют переключиться на CDI для подготовленности для будущих путей обновления. CDI легко доступен в веб-профилях Java EE, совместимые контейнеры, такие как Wildfly, Tomee и Glassfish. Для Tomcat вы должны установить его отдельно, точно так же, как вы уже сделали для JSF. Смотрите также Как установить CDI в Tomcat?

С Java EE 6 и CDI у вас есть разные вариант для управляемых бобов

  • @javax.faces.bean.ManagedBean Обращается к JSR 314 и был введен с JSF 2.0. Основной целью было избегать конфигурации в файле FACES-CONFIG.XML, чтобы использовать боб внутри страницы JSF.
  • @javax.annotation.ManagedBean(“myBean”) определяется JSR 316. Обосновала JSF Managed Beans для использования в другом месте в Java EE
  • @javax.inject.Named(“myBean”) почти такие же, как то, что одна выше, за исключением того, что вам нужен файл beans.xml в папке Web / Web-Inf для активации CDI.

Я использовал CDI в Glassfish 3.0.1, но чтобы добраться до работы, мне пришлось импортировать шва 3 рамки (сварным шва). Это работало довольно хорошо.

В Glassfish 3.1 CDI перестал работать, а шва шва перестала работать с ним. Я открыл А. ошибка на этом Но еще не видели это исправлено. Мне пришлось преобразовать весь мой код для использования javax.faces. * Аннотации, но я планирую вернуться к CDI, как только они его работают.

Я согласен, что вы должны использовать CDI, но один вопрос, который я еще не видел, это то, что делать с аннотацией @viewscoped. У меня много кода, который зависит от него. Неясно, работает ли @viewscoped, если вы не используете @managebean с ним. Если кто-то может уточнить это, я был бы признателен за это.

Одна веская причина перейти к CDI: у вас может быть общий ресурс для определения сеанса (например, профиль пользователя) @Inject«В обоих командах JSF управляемых бобов и служб отдыха (т. Е. Джерси / JAX-RS).

С другой стороны, @ViewScoped Является ли убедительным причинам придерживаться JSF @ManagedBean - особенно для чего-либо со значительным ajax. В CDI нет стандартной замены в CDI.

Кажется, что он может иметь некоторую поддержку для @ViewScoped- подобная аннотацию для фасолей CDI, но я не играл с ним лично.

http://seamframework.org/seam3/facesmodule.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top