Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Jsf+spring
Форум программистов > Системное программирование > Java
sg_dread
Ситуация такая:
есть бины, создаваемые и инициализированные в контейнере 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 без такого шаманства?
rmksuxx
в faces-config.xml добавь

<application>
<variable-resolver>org.springframework.web.jsf.DelegatingVariableResolver</variable-esolver>
</application>
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2008 IPS, Inc.