2012-07-03 4 views
0

주석과 최대 절전 모드로 Spring 3에 몇 가지 문제가 있습니다.Spring 3 + LazyInitializationException + OpenSessionInViewFilter

다른 모든 JSP에 포함될 JSP에서 이것을 실행하려고하면이 헤더가 헤더에 포함됩니다. 내가 제대로 주석 컨트롤러 또는 서비스에서 getNotifications를 호출 할 경우

${pageContext['request'].userPrincipal.principal.notifications} 

내 사용자 POJO 나는 아무 문제가 없다,이

@OneToMany(mappedBy="user", fetch = FetchType.LAZY) 
    protected Collection<Notification> notifications; 

같은 통지와 관계를 가지고,하지만 난을 실행하기 위해 노력하고있어 때 JSP로 insede 코드는,이 하나의 같은 LazyInitializationException이받은 :

org.hibernate.LazyInitializationException: failed to lazily initialize a 
    collection of role: org.prog.para.model.pojo.user.User.notifications, no session or 
    session was closed 

내가 OpenSessionInViewFilter에 대해 읽을 수 있지만 작동하지 않는 이유를 모르겠어요.

내 web.xml의 :

<filter> 
    <filter-name>OpenSessionInViewFilter</filter-name> 
    <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class> 
    <init-param> 
     <param-name>singleSession</param-name> 
     <param-value>true</param-value> 
    </init-param> 
</filter> 
<filter-mapping> 
    <filter-name>OpenSessionInViewFilter</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 

<listener> 
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
</listener> 

<context-param> 
    <param-name>contextConfigLocation</param-name> 
    <param-value> 
     /WEB-INF/spring/app-config.xml 
     /WEB-INF/spring/security-config.xml 
    </param-value> 
</context-param> 
<context-param> 
    <param-name>defaultHtmlEscape</param-name> 
    <param-value>true</param-value> 
</context-param> 

<servlet> 
    <servlet-name>para-mvc</servlet-name> 
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
    <init-param> 
     <param-name>contextConfigLocation</param-name> 
     <param-value>/WEB-INF/spring/mvc-config.xml</param-value> 
    </init-param> 
    <load-on-startup>1</load-on-startup> 
</servlet> 
<servlet-mapping> 
    <servlet-name>para-mvc</servlet-name> 
    <url-pattern>/</url-pattern> 
</servlet-mapping> 

<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> 
</filter-mapping> 

<filter> 
    <filter-name>CharacterEncodingFilter</filter-name> 
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> 
    <init-param> 
     <param-name>encoding</param-name> 
     <param-value>UTF-8</param-value> 
    </init-param> 
    <init-param> 
     <param-name>forceEncoding</param-name> 
     <param-value>true</param-value> 
    </init-param> 
</filter> 
<filter-mapping> 
    <filter-name>CharacterEncodingFilter</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 

<servlet-mapping> 
    <servlet-name>default</servlet-name> 
    <url-pattern>/static/*</url-pattern> 
</servlet-mapping> 

내 응용 프로그램-config.xml 파일은 다음과 같습니다

<context:component-scan base-package="org.prog.para"> 
    <context:exclude-filter expression="org.springframework.stereotype.Controller" type="annotation" /> 
</context:component-scan> 

<!-- Datasource --> 
<import resource="ds-config.xml" /> 

<bean id="sessionFactory" 
    class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> 
    <property name="dataSource" ref="dataSource" /> 
    <property name="packagesToScan" value="org.prog.para.model.pojo" /> 
    <property name="hibernateProperties"> 
     <props> 
      <prop key="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</prop> 
      <prop key="hibernate.default_schema">schema</prop> 
      <prop key="hibernate.show_sql">true</prop> 
     </props> 
    </property> 
</bean> 

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

<tx:annotation-driven transaction-manager="hibernateTransactionManager" 
    proxy-target-class="true" mode="proxy" /> 


<bean id="emailTemplateResolver" class="org.thymeleaf.templateresolver.ServletContextTemplateResolver"> 
    <property name="prefix" value="/WEB-INF/views/templates/" /> 
    <property name="suffix" value=".html" /> 
    <property name="characterEncoding" value="UTF-8" /> 
    <property name="order" value="1" /> 
</bean> 

<bean id="templateEngine" class="org.thymeleaf.spring3.SpringTemplateEngine"> 
    <property name="templateResolvers" ref="emailTemplateResolver" /> 
</bean> 

<bean id="viewResolver" class="org.thymeleaf.spring3.view.ThymeleafViewResolver"> 
    <property name="templateEngine" ref="templateEngine" /> 
    <property name="characterEncoding" value="UTF-8" /> 
</bean> 


<bean id="springApplicationContext" class="org.prog.para.config.SpringApplicationContext" /> 

사람은 나의 실패 곳을 알고있다? 보기가 실행될 때 내 세션이 닫히는 이유를 이해할 수 없습니다.

FetchType.EAGER를 알림 컬렉션에 넣는 방법으로 해결할 수 있지만 원하는 것은 아닙니다. 나는 게으른 관계가 필요합니다.

미리 감사드립니다.

+0

해당 서비스에 대한 @ 트랜잭션 설정은 무엇입니까? – mmalmeida

답변

0

OpenSessionInViewInterceptorOpenSessionInViewFilter을 모두 사용하고 있다는 문제가 있다고 생각합니다. 그 중 하나를 제거하십시오.

+0

미안 해요, 요격기가 제가 테스트 한 마지막 해결책이었습니다. 인터셉터 코드를 삭제해도 여전히 작동하지 않습니다. 또한 필터 양식 web.xml을 제거하고 인터셉터 코드를 남긴 채로 여전히 실패합니다! – CAAY

+0

$ {pageContext [ 'request'] .userPrincipal.principal.notifications}에 대한 자세한 정보를 제공 할 수 있습니까? 스프링 보안 인증입니까? –

+0

$ {pageContext [ 'request']. userPrincipal.principal}는 User (내 사용자)에게 구문 분석 할 수있는 Object를 반환합니다. 예, 스프링 보안 인증입니다. 컨트롤러 내부에 프린시 펄을 가져 오면이를 사용자에게 캐스팅하고 올바르게 getNotifications()를 실행할 수 있습니다. 문제는 OpenSessionInViewFilter가 JSP를 세션으로 확장하지 않는다는 것입니다. – CAAY

관련 문제