2012-11-08 34 views
1

我正在研究一個基於Spring,Hibernate和JSF的Web應用程序,而且我正面臨着多次討論過的已知問題。見下文:hibernate在上下文中延遲加載異常Spring JSF應用程序

17:42:11,970錯誤[STDERR] 7 nov。 2012 17:42:11 javax.faces.component.UIInput updateModel GRAVE:createProjectForm:projectStatus:處理提交的信息時發生錯誤。 17:42:11,972信息[標準輸出] 17:42:11錯誤org.hibernate.LazyInitializationException無法初始化代理 - 無會話 org.hibernate.LazyInitializationException:無法初始化代理 - 沒有會話 at org.hibernate.proxy。 AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:57) 在org.hibernate.proxy.pojo.BasicLazyInitializer.invoke(BasicLazyInitializer.java:75) 在org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java: 160) 在com.company.entity.TLsta _ _ $$ javassist_6.setLStat(TLsta _ _ $$ javassist_6.java) 在sun.reflect.NativeMethodAccessorImpl.invoke0(本機方法) 在sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java :39) 在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 在java.lang.reflect.Method.invoke(Method.java:597) 在javax.el.BeanELResolver.setValue(BeanELResolver.java:108) at javax.el.CompositeELResolver.setValue(CompositeELResolver.java:68) at com.sun.faces.el.FacesCompositeELResolver.setValue(FacesCompositeELResolver.java:100) at org.apache.el.parser.AstValue.setValue( AstValue.java:114) at org.apache.el.ValueExpressionImpl.setValue(ValueExpressionImpl.java:249) at com.sun.facelets.el.TagValueExpression.setValue(TagValueExpression.java:93) at javax.faces。 component.UIInput.updateModel(UIInput.java:771) at javax.faces.component.UIIn put.processUpdates(UIInput.java:703) at javax.faces.component.UIForm.processUpdates(UIForm.java:261) at org.ajax4jsf.component.AjaxViewRoot $ 2.invokeContextCallback(AjaxViewRoot.java:419) at org .ajax4jsf.component.AjaxViewRoot.processPhase(AjaxViewRoot.java:235) at org.ajax4jsf.component.AjaxViewRoot.processUpdates(AjaxViewRoot.java:435) at com.sun.faces.lifecycle.UpdateModelValuesPhase.execute(UpdateModelValuesPhase.java :78) at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:100) at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118) at javax.faces.webapp .FacesServlet.service(FacesServlet.java:265) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(Ap plicationFilterChain.java:290) 在org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 在org.ajax4jsf.webapp.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:178) 在org.ajax4jsf。 webapp.BaseFilter.handleRequest(BaseFilter.java:290) 在org.ajax4jsf.webapp.BaseFilter.processUploadsAndHandleRequest(BaseFilter.java:388) 在org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:515) 在org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) 在org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 在org.springframework.security.util.FilterChainProxy $ VirtualFilterChain.doFilter(FilterChainProxy.java:394) at org.springframework.security.intercept.web.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor。org.springframework.security.intercept.web.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:109) Java的:83) 在org.springframework.security.util.FilterChainProxy $ VirtualFilterChain.doFilter(FilterChainProxy.java:406) 在org.springframework.security.ui.SessionFixationProtectionFilter.doFilterHttp(SessionFixationProtectionFilter.java:67) 的組織。 springframework.security.ui.SpringSecurityFilter.doFilter(SpringSecurityFilter.java:53) at org.springframework.security.util.FilterChainProxy $ VirtualFilterChain.doFilter(FilterChainProxy.java:406) at org.springframework.security.ui.ExceptionTranslationFilter。 doFilterHttp(ExceptionTranslationFilter.java:101) at org.springframework.security.ui.SpringSecurityFilter.doFilter(SpringSecurityFilter.java:53) at org.springframework.security.util.FilterChainProxy $ VirtualFilterChain.doFilter(FilterChainProxy.java:406) 在org.springframework.security.providers.anonymous.AnonymousProcessingFilter.doFilterHttp(AnonymousProcessingFilter.java:10 在org.springframework.security.ui.SpringSecurityFilter.doFilter(在org.springframework.security.util SpringSecurityFilter.java:53) .FilterChainProxy $ VirtualFilterChain.doFilter(FilterChainProxy.java:406) 在org.springframework.security.wrapper.SecurityContextHolderAwareRequestFilter.doFilterHttp(SecurityContextHolderAwareReque 在org.springframework.security.ui.SpringSecurityFilter.doFilter(SpringSecurityFilter.java:53) 在org.springframework.security.util.FilterChainProxy $ VirtualFilterChain.doFilter(FilterChainProxy.java:406) 在org.springframework.security.ui.AbstractProcessingFilter.doFilterHttp(AbstractProcessingFilter.java:278) 在org.springframework.security.ui.SpringSecurityFilter.doFilter(SpringSecurityFilter.java:53) 在org.springframework.security.util.FilterChainProxy $ VirtualFilterChain.doFilter(FilterChainProxy.java:406) 在org.springframework.security。 ui.logout.LogoutFilter.doFilterHttp(LogoutFilter.java:89) at org.springframework.security.ui.SpringSecurityFilter.doFilter(SpringSecurityFilter.java:53) at org.springframework.security.util.FilterChainProxy $ VirtualFilterChain.doFilter( FilterChainProxy.java:406) 在org.springframework.security.context.HttpSessionContextIntegrationFilter.doFilterHttp(是HttpSessionContextIntegrationFilter 在org.springframework.security.ui.SpringSecurityFilter.doFilter(SpringSecurityFilter.java:53)

我嘗試以下解決方案,但沒有成功:(:

  • OpenViewInSession過濾
  • @Transactional註解
  • 同樣,Hibernate.initialize(對象)

我想我的問題是有關到JSF不能得到當前的Hibernate sesssion,但我不知道如何解決這個問題。

我使用:

  • JSF 1.2
  • RichFaces的3.3.2
  • Spring 2.5的
  • 的Hibernate 3.2.5
  • 的JBoss 4.2

查找下面我配置文件和源代碼:

web。XML

<!-- Hibernate filter --> 
<filter> 
    <filter-name>hibernateFilter</filter-name> 
    <filter-class> 
     org.springframework.orm.hibernate3.support.OpenSessionInViewFilter 
    </filter-class> 
    <init-param> 
     <param-name>sessionFactoryBeanName</param-name> 
     <param-value>sessionFactory</param-value> 
    </init-param> 
</filter> 
<filter-mapping> 
    <filter-name>hibernateFilter</filter-name> 
    <url-pattern>/*</url-pattern> 
    <dispatcher>REQUEST</dispatcher> 
    <dispatcher>FORWARD</dispatcher> 
</filter-mapping> 

<!-- Security --> 
<filter> 
    <filter-name>springSecurityFilterChain</filter-name> 
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> 
</filter> 
<filter-mapping> 
    <filter-name>springSecurityFilterChain</filter-name> 
    <url-pattern>/*</url-pattern> 
    <dispatcher>FORWARD</dispatcher> 
    <dispatcher>REQUEST</dispatcher> 
    <dispatcher>ERROR</dispatcher> 
    <dispatcher>INCLUDE</dispatcher> 
</filter-mapping> 
<!-- jsf listener --> 
<listener> 
    <listener-class>com.sun.faces.config.ConfigureListener</listener-class> 
</listener> 

<!-- spring listener --> 
<listener> 
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener- class> 
</listener> 
<listener> 
    <listener- class>org.springframework.web.context.request.RequestContextListener</listener-class> 
</listener> 

<!-- jsf servlet --> 
<servlet> 
    <servlet-name>Faces Servlet</servlet-name> 
    <servlet-class>javax.faces.webapp.FacesServlet</servlet-class> 
    <load-on-startup>1</load-on-startup> 
</servlet> 
<servlet-mapping> 
    <servlet-name>Faces Servlet</servlet-name> 
    <url-pattern>*.jsf</url-pattern> 
</servlet-mapping> 

<!-- RichFaces login --> 
<login-config> 
    <auth-method>BASIC</auth-method> 
</login-config> 

的applicationContext.xml

<!-- DataSource --> 
<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean"> 
    <property name="jndiName"> 
     <value>java:oracleDS</value> 
    </property> 
</bean> 

<!-- Session Factory --> 
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> 
    <property name="dataSource"> 
     <ref bean="dataSource"/> 
    </property> 
    <property name="mappingLocations" value="classpath:*.hbm.xml" /> 

    <property name="hibernateProperties"> 
     <props> 
      <prop key="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</prop> 
      <prop key="hibernate.show_sql">false</prop> 
     </props> 
    </property> 
</bean> 

<!-- Generic DAO --> 
<bean id="genericDAO" class="com.company.dao.GenericDaoImpl"> 
    <property name="sessionFactory" ref="sessionFactory"/> 
</bean> 

<bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> 
     <property name="sessionFactory" ref="sessionFactory" /> 
</bean> 

<tx:annotation-driven transaction-manager="txManager"/> 

<bean id="genericManager" class="com.company.services.GenericManagerImpl"> 
    <property name="dao" ref="genericDAO"/> 
</bean> 

<context:component-scan base-package="com.company"> 
    <context:include-filter type="regex" expression="com.company.beans.projectdirectory.Maintain*"/> 
    <context:include-filter type="regex" expression="com.company.beans.projectdirectory.services.ProjectDirectoryManager"/> 
    <context:include-filter type="regex" expression="com.company.beans.app.*"/> 
</context:component-scan> 
<context:annotation-config /> 

Create.xhtml哪裏有存取權限屬性導致錯誤:

<rich:comboBox value="#{createProjectBean.project.TPsta.PStat}"id="projectStatus" selectFirstOnUpdate="false" width="145" 
required="true" requiredMessage="#{msg.CMP_requiredPrjStatusError}"> 
<f:selectItems value="#{createProjectBean.projectStatusOptions}" /> 
</rich:comboBox> 

任何想法,該怎麼辦?

+0

您需要發佈一些您的配置和代碼,然後才能提供幫助。 –

+0

請在我的文章中找到我的配置文件和源代碼 – aimhaj

回答

0

看起來像在'調用應用程序'階段之前發生的'UpdateModelValuesPhase'中有這個異常。 「調用應用程序」階段是您通常執行大部分處理的地方。

如果您使用的是openSessionInView過濾器,但仍然收到此異常,則可能是您在上次請求期間加載了代理服務器,但正試圖在當前請求期間訪問它。由於該代理與已關閉的舊會話相關聯,因此會出現LazyInitialization異常。

+0

您的分析似乎是合乎邏輯的,看起來像是這個問題,但我怎麼知道我是否加載了代理?或者你可以建議我一個解決方案? – aimhaj

+0

您可以使用跨越「長對話」的擴展休眠會話。通過將Hibernate會話存儲在Http Session中,您基本上可以爲整個工作流使用相同的hibernate會話。但是這可能會導致其他問題,並且總體上更好地避免。詳情請參閱這些鏈接 - http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/transactions.html#transactions-basics-apptx https://community.jboss.org/wiki/ OpenSessionInView#What_about_the_extended_Session_pattern_for_long_Conversations – Sashi

+0

另一個解決方案是 - 識別您正嘗試在當前會話中加載的上一個會話中的對象。第一個選項,確保它在前一個會話中完全加載,以便您不必在當前會話中延遲加載它。第二個選項,在當前請求期間,使用session.lock(Object)重新關聯對象與當前會話。 – Sashi

相關問題