JSF 2 внедряет Spring bean / service с @ManagedProperty и без XML - PullRequest
15 голосов
/ 19 января 2012

Я хотел бы использовать аннотации JSF и немного весны аннотации для внедрения весеннего компонента / службы в управляемый компонент JSF. (на бине jsf я только хочу использовать аннотации jsf) Я не хочу использовать аннотации типа @named / @inject.

Я пытался найти решение в сети, но безуспешно.

Пример

@ManagedBean
@ViewScoped 
public class MyBean {

    @ManagedProperty(value = "#{mySpringBean}")
    private MySpringBean mySpringBean;

    public void setMySpringBean(MySpringBean mySpringBean) {
        this.mySpringBean = mySpringBean;
    }

    public void doSomething() {
    //do something with mySpringBean
    }
}

Возможно ли что-то подобное без использования xml. Например, Я не хотел бы использовать что-то вроде

FacesContextUtils.getWebApplicationContext(context).getBean("MySpringBean");

или faces-config.xml

<managed-bean>
    <managed-bean-name>myBean</managed-bean-name>
    <managed-bean-class>com.mytest.MyBean</managed-bean-class>
    <managed-bean-scope>view</managed-bean-scope>
    <managed-property>
        <property-name>mySpringBean</property-name>
        <value>#{mySpringBean}</value>
    </managed-property>
</managed-bean>

Возможно ли что-то подобное вышеописанному с аннотациями и без определение всех JSF-компонентов / свойств и Spring-компонентов / свойств для каждый компонент в XML-файлах конфигурации?

Ответы [ 3 ]

14 голосов
/ 20 января 2012

Если у вас уже есть контейнер Spring, почему бы не использовать его аннотацию @Autowired. Для этого обновите файл face-config.xml в соответствии с рекомендациями Boni. Затем добавьте этих слушателей в ваш web.xml после этого

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/applicationContext.xml</param-value>
</context-param>

<listener>
  <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

<listener>
  <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
</listener>

Затем добавьте их в свое приложениеContext.xml

<context:component-scan base-package="com.examples" />

Теперь вы можете использовать аннотации Spring, и ваш бин будет выглядеть примерно так:

package com.examples;
@Component
@Scope(value="request")
public class MyBean {
    @Autowired
    private MySpringBeanClass mySpringBean;
}

Аннотируйте свой MySpringBeanClass с @ Service

Смотрите также:

11 голосов
/ 19 января 2012

Поместите этот код в ваши лица-config.xml

<faces-config 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/web-facesconfig_2_0.xsd"
    version="2.0">
    <application>
        <el-resolver>org.springframework.web.jsf.el.SpringBeanFacesELResolver</el-resolver>
    </application>
</faces-config>

Тогда в вашем вызове конструктора ManageBean;

WebApplicationContext ctx =  FacesContextUtils.getWebApplicationContext(FacesContext.getCurrentInstance());
mySpringBean = ctx.getBean(MySpringBean.class);

MySpringBean означает ваш класс бобов Spring

3 голосов
/ 23 января 2012

Если вы правильно настроили Spring в файлах web.xml и applicationContext.xml.Сделайте следующую запись вface-config.xml

<application>
     <el-resolver>org.springframework.web.jsf.el.SpringBeanFacesELResolver</el-resolver>
</application>

Ваш пример кода, приведенный выше, выглядит нормально.Что произойдет с приведенной выше записью, так это то, что Managed Property будет сначала просматриваться в bean-компонентах, управляемых JSF, если не найден, будет производиться поиск в bean-компонентах, управляемых Spring.У вашего bean-компонента должны быть помечены правильные аннотации, а имя, указанное в @ManagedProperty, должно совпадать с именем по умолчанию / name, указанным для bean-компонента.

Как уже упоминалось @Boni, это не требуется, он автоматически вводится.Я использовал настройки по вашему желанию.

Примечание: поскольку вы выбираете область видимости, просмотрите эту ссылку Преимущества и недостатки @ViewScoped

...