1. Наш канал codeby в telegram. Пишем об информационной безопасности, методах защиты информации, о программировании. Не пропускай новости с кодебай, будь в тренде ! Подробнее ...

    Скрыть объявление

Jsf+spring

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

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

    sg_dread Гость

    Репутация:
    0
    Ситуация такая:
    есть бины, создаваемые и инициализированные в контейнере 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 без такого шаманства?
     
  2. rmksuxx

    rmksuxx Гость

    Репутация:
    0
    в faces-config.xml добавь

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

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