Jsf+spring

  • Автор темы sg_dread
  • Дата начала
Статус
Закрыто для дальнейших ответов.
S

sg_dread

#1
Ситуация такая:
есть бины, создаваемые и инициализированные в контейнере 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>
applicationContext.xml
Код:
<?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-овский бин на момент Dependency Injection почему-то оказывается неинициализированным.
Решил эту проблему, инициализировав Spring-бин при помощи написания собственного слушателя HttpSessionListener, который инициализирует необходимые мне бины.

Кто знает, как подружить JSF и Spring без такого шаманства?
 
R

rmksuxx

#2
в faces-config.xml добавь

<application>
<variable-resolver>org.springframework.web.jsf.DelegatingVariableResolver</variable-esolver>
</application>
 
Статус
Закрыто для дальнейших ответов.