2012-07-03 1 views
0

У меня возникают проблемы с Spring 3 с аннотациями и спящим.Spring 3 + LazyInitializationException + OpenSessionInViewFilter

Im пытается выполнить это в JSP, который будет включен во все остальные JSP, его заголовок.

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

Моего POJO Пользователь имеет отношение с уведомлениями, как этот

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

Если я позвоню getNotifications от контроллера или службы правильно аннотированный, у меня нет никаких проблем, но когда я пытаюсь выполнить команду код insede в JSP, я получил 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

Какие настройки @transaction у вас есть в соответствующей службе? – mmalmeida

ответ

0

Я думаю, что проблема может быть в том, что вы используете как OpenSessionInViewInterceptor, так и OpenSessionInViewFilter. Попробуйте удалить один из них.

+0

К сожалению, перехватчик был последним решением, которое я тестировал. Удаление кода перехватчика все еще не работает. Кроме того, удаление формы фильтра web.xml и оставление кода перехватчика, все еще не удается! – CAAY

+0

Можете ли вы дать более подробную информацию о $ {pageContext ['request']. UserPrincipal.principal.notifications}. Это аутентификации Spring Security? –

+0

$ {pageContext ['request']. UserPrincipal.principal} возвращает объект, который может быть обработан пользователем (мой собственный пользователь). да, это проверка подлинности на весну. Если я получу принципал внутри контроллера, я могу передать его пользователю и правильно выполнить getNotifications(). Проблема заключается в том, что OpenSessionInViewFilter не расширяет сеанс до моих JSP – CAAY

 Смежные вопросы

  • Нет связанных вопросов^_^