JSF 2 вставляет Spring bean/сервис с @ManagedProperty и без xml
Я хотел бы использовать аннотации jsf и некоторые spring
аннотации для ввода a spring bean/service в управляемый jsf bean.
(на jsf bean я хочу только использовать аннотации 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 beans/и свойства spring beans/для
каждый bean в файлах конфигурации xml?
Ответы
Ответ 1
Если у вас уже есть контейнер Spring, почему бы не использовать его @Autowired аннотацию. Для этого обновите ваши faces-config.xml, как это было предложено Бони. Затем добавьте этих слушателей в ваш 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>
Затем добавьте их в свой applicationContext.xml
<context:component-scan base-package="com.examples" />
Теперь вы можете использовать аннотации Spring, а ваш bean будет примерно таким:
package com.examples;
@Component
@Scope(value="request")
public class MyBean {
@Autowired
private MySpringBeanClass mySpringBean;
}
Аннотировать свой MySpingBeanClass с помощью @Service
См. также:
Ответ 2
Поместите этот код в ваши faces-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 Constructor;
WebApplicationContext ctx = FacesContextUtils.getWebApplicationContext(FacesContext.getCurrentInstance());
mySpringBean = ctx.getBean(MySpringBean.class);
MySpringBean означает ваш Spring Bean класс
Ответ 3
Предположим, что вы правильно настроили Spring в web.xml и applicationContext.xml.
Сделайте следующую запись в faces-config.xml
<application>
<el-resolver>org.springframework.web.jsf.el.SpringBeanFacesELResolver</el-resolver>
</application>
Ваш пример кода, приведенный выше, кажется прекрасным. Что произойдет с вышеприведенной записью, это Managed Property будет сначала рассмотрено в beans, управляемом JSF, если не найдено, будет поиск в beans, управляемый Spring. Ваш Spring bean должен иметь соответствующие аннотации, а имя, указанное в @ManagedProperty, должно совпадать с именем по умолчанию/именем, указанным в bean.
Как уже упоминалось @Boni, который не требуется, он автоматически вводится. Я использовал настройки по вашему желанию.
Замечание: поскольку вы выбираете область обзора, посмотрите на эту ссылку Преимущества и недостатки @ViewScoped