Вопрос по jsf, integration, dependency-injection, spring, managed-bean – Интеграция Spring JSF: как внедрить компонент / службу Spring в управляемый компонент JSF?

34

Я понимаю, что управляемый компонент работает как контроллер, потому что ваша единственная задача "ссылка на сайт" слой представления с моделью.

Чтобы использовать компонент в качестве управляемого компонента, я должен объявить@ManagedBeanаннотации, делая это, я могу общаться JSF с бином напрямую.

Если я хочу добавить какой-то компонент (из Spring) в этот управляемый компонент, у меня есть два возможных пути:

Выберите свойство в ManagedBean (например, «BasicDAO dao ") и объявить@ManagedProperty(#{"basicDAO"}) над собственностью. Делая это, ям впрыскивая боб"basicDAO" из весны в ManagedBean.

Объявлен @Controller в классе ManagedBean, тогда ябудет иметь@ManagedBean а также@Controller аннотации, все вместе. И в собственности"BasicDAO dao" я должен использовать@Autowired из весны.

Правильно ли мое понимание?

Ваш Ответ

3   ответа
1

Самый простой способ сделать это - через XML. я использовал,@Component в уже сделанном JSF удалось боб, но@Autowired не сработало, потому что управляемый bean-компонент уже был в файле names-config.xml. Если это обязательное сохранение определения управляемого компонента вместе с его управляемым свойством в файле xml, рекомендуется добавить пружинный компонент в качестве другого управляемого свойства в теге управляемого компонента. Здесь bean-компонент spring определен в spring-config.xml (может быть подключен где-то поочередно). пожалуйста, обратитесьhttps://stackoverflow.com/a/19904591/5620851

отредактировано мной. Я предлагаю либо реализовать это полностью через аннотации @Managed и @Component, либо через xml для обоих.

6

Есть еще один способ использования bean-компонентов, управляемых Spring, в bean-компонентах, управляемых JSF, просто расширяя ваш bean-компонент JSF изSpringBeanAutowiringSupport и Spring будет обрабатывать внедрение зависимостей.

@ManagedBean // JSF-managed.
@ViewScoped // JSF-managed scope.
public class GoodBean extends SpringBeanAutowiringSupport {

    @Autowired
    private SpringBeanClass springBeanName; // No setter required.

    // springBeanName is now available.
}
я знаю@ManagedBean являетсяDEPRECATED в JSF. Но, как вы видите, спрашивающий упоминает@ManagedBean в вопросе и опять как видите54 голосов " упоминает о@ManagedBean также. И снова, как вы видите, я начал свой ответ, сказав:Есть другой способ, Честно говоря, я неЯ думал, что мой ответ будет принят вместо @BalusC 'отличный ответ. Я просто хотел показать другой более простой способ. Я нене понимаю, как я мог заслужить эти "я"м почти склонен к понижению слова :)тот же человек, который задал вопрос? лол, нет: D Вы когда-нибудь пробовали это раньше? :) tylerdurden
Вы тот же человек, который изначально задал вопрос? Использование аннотаций @ManagedBeanDEPRECATED в JSF, как и области, определенные JSF. Все будет CDI, а с весны вроде какзнает об этих аннотациях CDI (если я все правильно прочитал), перейдя к этим 'новый» CDI-аннотации - лучший способ. Нет необходимости расширять классы и т.д .. Ям почти склонен к понижению, но оставлю это на усмотрение настоящих экспертов) Kukeltje
Причина, по которой я заявилпочти склонен понизить  потому что это зависело от того, что вы - тот же человек, что и ОП, с другой учетной записью. Если нет, яЯ не собираюсь понижать голос. Тем не менее, ваши комментарии по поводу другого вопросатакже говоря о@ManagedBean не действительны. Это было 4 года назад, а несейчас, Если после всех этих лет ОП просто изменил принятый ответ, я серьезно не надеюсь, что он собирается изменить весь свой код ;-). Дело закрыто ... Ура !!! Kukeltje
73
@ManagedBean против@Controller

Прежде всего, вы должны выбратьодин рамки для управления вашими бобами. Вы должны выбрать JSF или Spring (или CDI) для управления вашими компонентами. Хотя следующие работы, это в корне неправильно:

@ManagedBean // JSF-managed.
@Controller // Spring-managed.
public class BadBean {}

Вы в конечном итогедва полностью отдельные экземпляры одного и того же класса управляемых компонентов, один из которых управляется JSF, а другой - Spring. Это'не ясно, какой из нихна самом деле использоваться в EL, когда вы ссылаетесь на него как#{someBean}, Если у вас естьSpringBeanFacesELResolver зарегистрирован вfaces-config.xmlтогда это будет управляемый Spring, а не JSF-управляемый. Если вы неЕсли бы это было так, то это было бы под управлением JSF.

Кроме того, когда вы объявляете конкретную область действия управляемого JSF-компонента, такую как,@RequestScoped@ViewScoped@SessionScoped или же@ApplicationScoped отjavax.faces.* пакет, он будет только признан и использован@ManagedBean, Это победилобыть понятым@Controller как он ожидает свой собственный@Scope аннотаций. По умолчанию используется синглтон (область приложения), если он отсутствует.

@ManagedBean // JSF-managed.
@ViewScoped // JSF-managed scope.
@Controller // Spring-managed (without own scope, so actually becomes a singleton).
public class BadBean {}

Когда вы ссылаетесь на вышеупомянутый компонент через#{someBean}, он будет возвращать bean-объект с областью действия под управлением Spring, а не bean-объект с областью видимости под управлением JSF.

@ManagedProperty против@Autowired

JSF-специфичный@ManagedProperty работает только в JSF-управляемых bean-компонентах, т.е. когда выповторное использование@ManagedBean, Весенний@Autowired работает только в бинах, управляемых Spring, т. е. когда выповторное использование@Controller, Ниже подходы являются менее или более эквивалентными и не могут быть смешаны:

@ManagedBean // JSF-managed.
@RequestScoped // JSF-managed scope.
public class GoodBean {

    @ManagedProperty("#{springBeanName}")
    private SpringBeanClass springBeanName; // Setter required.
}
@Component // Spring-managed.
@Scope("request") // Spring-managed scope.
public class GoodBean {

    @Autowired
    private SpringBeanClass springBeanName; // No setter required.
}

Обратите внимание, что когда у вас естьSpringBeanFacesELResolver зарегистрирован вfaces-config.xml в соответствии сJavadoc,


    ...
    org.springframework.web.jsf.el.SpringBeanFacesELResolver

и, таким образом, вы можете ссылаться на управляемые бины Spring в EL через#{springBeanName}тогда вы можете просто сослаться на них в@ManagedProperty также, поскольку он в основном устанавливает оценочный результат данного выражения EL. И наоборот, вводя управляемый компонент JSF через@Autowired, никоим образом не поддерживается. Однако вы можете использовать@Autowired в управляемом bean-компоненте JSF при ручной регистрации экземпляра управляемого bean-компонента JSF в контексте автопреобразования Spring, как показано ниже. Смотрите такжеКак красиво интегрировать JSF 2 и Spring 3 (или Spring 4) для подвоха.

@ManagedBean // JSF-managed.
@ViewScoped // JSF-managed scope.
public class GoodBean implements Serializable {

    @Autowired
    private SpringBeanClass springBeanName; // No setter required.

    @PostConstruct
    private void init() {
        FacesContextUtils
            .getRequiredWebApplicationContext(FacesContext.getCurrentInstance())
            .getAutowireCapableBeanFactory().autowireBean(this);

        // springBeanName is now available.
    }
}
@XxxScoped против@Scope

Спринга@Scope имеет ограниченную поддержку областей JSF. Там'нет эквивалента для JSF@ViewScoped, Вы'я в основном либо самодостаточно создаю собственные области видимости, либо использую ручную регистрацию экземпляра управляемого JSF-компонента в контексте автопредставления Spring, как показано выше.

И, с другой стороны, Spring WebFlow был перенят в JSF 2.2 через новые@FlowScoped аннотаций. Так что, если вы уже находитесь на JSF 2.2, то вы неОбязательно нужно использовать Spring WebFlow, если вы хотите только область видимости потока.

CDI - пытаясь объединить все это

Начиная с Java EE 6, CDI предлагается как стандартная альтернатива Spring DI. Имеет соответственно@Named а также@Inject аннотации для этого, а также собственный набор областей. Я'я не уверен, как он взаимодействует с Spring, как я неВесной, но@Inject работает внутри@ManagedBean, а также@ManagedProperty внутри@ManagedBean может ссылаться на@Named боб. С другой стороны,@ManagedProperty Безразлично»работать внутри@Named боб.

Целью CDI является объединение всех различных структур управления компонентами в единую спецификацию / интерфейс. Spring мог бы быть полной реализацией CDI, но они решили реализовать ее только частично (только JSR-330javax.inject.* поддерживается, но JSR-299javax.enterprise.context.* не). Смотрите такжеБудет ли Spring поддерживать CDI? а такжеэтот урок.

JSF перейдет на CDI для управления компонентами и устареет@ManagedBean и друзья в будущей версии.

Смотрите также:Когда необходимо или удобно использовать Spring или EJB3 или все вместе?Сервисный уровень JSFПоддержка бобов (@ManagedBean) или CDI-бинов (@Named)?Использование JSF в качестве технологии просмотра Spring MVCКак установить и использовать CDI на Tomcat?
Ответ с 54 голосами заменен принятым на новый, ссылающийся на устаревшие аннотации ... Ух ты ... Kukeltje
Вы сказали: "Специфичный для JSF @ ManagedProperty работает только в управляемых JSF bean-компонентах, т.е. когда выповторное использование @ ManagedBean ", Но я'Я использую @ ManagedProperty для защиты Spring-Bean, и это прекрасно работает. Как я сказал: яиспользуя @ ManagedProperty (# {'basicDAO»}) и бобbasicDAO» является бином @ Repository. RonaldoLanhellas
@ ManagedProperty это подход (который янаткнуться) интегрировать пружину с JSF (Inject Bean). во что я верю (поправьте меня, если янеправильно) org.springframework.web.jsf.el.SpringBeanFacesELResolver распространяет bean-компонент jsf в Spring Bean. И вообще мы создаем контейнер Spring (org.springframework.web.context.ContextLoaderListener), который составляет jsf. И, как сказал @BalusC, сейчас Spring неПоддержка Java EE 6 CDI. Я очень хотел @ ConversationalScope, который не поддерживается пружинным контейнером, имеющим JSF. Karthik Prasad
Итак, ManagedProperty похож на @Autowired, но в JSF. : D RonaldoLanhellas

Похожие вопросы