S
sg_dread
Ситуация такая:
есть бины, создаваемые и инициализированные в контейнере Spring
есть backing-beans JSF, отвечающие за логику JSF-страницы
Хочу скормить JSF-бину Spring-овский бин (Spring 2.0 - для этих целей использую его родной DelegatingVariableResolver), но... напоролся на одну неприятную штуку - пытался скормить бин следующим образом:
faces-config.xml
applicationContext.xml
MyBean.java
Теперь собственно "грабли": если в jsp-странице попытаться использовать строчку вроде:
, получим на несколько прогонов эксепшинов:
Spring-овский бин на момент Dependency Injection почему-то оказывается неинициализированным.
Решил эту проблему, инициализировав Spring-бин при помощи написания собственного слушателя HttpSessionListener, который инициализирует необходимые мне бины.
Кто знает, как подружить JSF и Spring без такого шаманства?
есть бины, создаваемые и инициализированные в контейнере Spring
есть backing-beans JSF, отвечающие за логику JSF-страницы
Хочу скормить JSF-бину Spring-овский бин (Spring 2.0 - для этих целей использую его родной DelegatingVariableResolver), но... напоролся на одну неприятную штуку - пытался скормить бин следующим образом:
faces-config.xml
Код:
<managed-bean>
<managed-bean-name>myBean</managed-bean-name>
<managed-bean-class>my.pack.MyBean</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
<managed-property>
<property-name>factory</property-name>
<value>#{factory}</value>
</managed-property>
</managed-bean>
Код:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
"http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<bean id="MyTimeServiceImpl" class="my.pack.MyServiceImpl" />
<bean id="factory" class="my.pack.ServiceFactory">
<constructor-arg index="0">
<ref bean="MyTimeServiceImpl"/>
</constructor-arg>
</bean>
</beans>
MyBean.java
Код:
public class MyBean {
private ServiceFactory factory;
public MyBean() {
}
public ServiceFactory setFactory() {
return factory;
}
public ServiceFactory getFactory() {
return factory;
}
public void setFactory(ServiceFactory factory) {
this.factory = factory;
}
public String getData() {
return (factory.getService().getNowStr());
}
}
Теперь собственно "грабли": если в jsp-странице попытаться использовать строчку вроде:
Код:
<h:outputText value="#{myBean.data}" />
, получим на несколько прогонов эксепшинов:
Код:
com.sun.faces.application.ApplicationImpl createAndMaybeStoreManagedBeans Can't set managed bean property: 'factory'.
javax.faces.FacesException: Can't set managed bean property: 'factory'.
at com.sun.faces.config.ManagedBeanFactory.setPropertiesIntoBean(ManagedBeanFactory.java:582)
at com.sun.faces.config.ManagedBeanFactory.newInstance(ManagedBeanFactory.java:234)
at com.sun.faces.application.ApplicationImpl.createAndMaybeStoreManagedBeans(ApplicationImpl.java:899)
at com.sun.faces.el.VariableResolverImpl.resolveVariable(VariableResolverImpl.java:84)
at org.springframework.web.jsf.DelegatingVariableResolver.resolveVariable(DelegatingVariableResolver.java:108)
at com.sun.faces.el.impl.NamedValue.evaluate(NamedValue.java:125)
at com.sun.faces.el.impl.ComplexValue.evaluate(ComplexValue.java:146)
at com.sun.faces.el.impl.ExpressionEvaluatorImpl.evaluate(ExpressionEvaluatorImpl.java:243)
at com.sun.faces.el.ValueBindingImpl.getValue(ValueBindingImpl.java:156)
at com.sun.faces.el.ValueBindingImpl.getValue(ValueBindingImpl.java:137)
at javax.faces.component.UIOutput.getValue(UIOutput.java:147)
...
Решил эту проблему, инициализировав Spring-бин при помощи написания собственного слушателя HttpSessionListener, который инициализирует необходимые мне бины.
Кто знает, как подружить JSF и Spring без такого шаманства?