Jsf+spring

Тема в разделе "Java", создана пользователем sg_dread, 15 ноя 2006.

Статус темы:
Закрыта.
  1. sg_dread

    sg_dread Гость

    Ситуация такая:
    есть бины, создаваемые и инициализированные в контейнере Spring
    есть backing-beans JSF, отвечающие за логику JSF-страницы

    Хочу скормить JSF-бину Spring-овский бин (Spring 2.0 - для этих целей использую его родной DelegatingVariableResolver), но... напоролся на одну неприятную штуку - пытался скормить бин следующим образом:

    faces-config.xml
    Код (Text):
      <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
    Код (Text):
    <?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
    Код (Text):
    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-странице попытаться использовать строчку вроде:

    Код (Text):
             <h:outputText value="#{myBean.data}" />
    , получим на несколько прогонов эксепшинов:


    Код (Text):
    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 без такого шаманства?
     
  2. rmksuxx

    rmksuxx Гость

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

    <application>
    <variable-resolver>org.springframework.web.jsf.DelegatingVariableResolver</variable-esolver>
    </application>
     
Статус темы:
Закрыта.

Поделиться этой страницей