2011-02-14 4 views
5

j'ai eu le fameux problème (en) avec mise en veille prolongée et le chargement paresseux lorsque les vues sont rendus .... Comme beaucoup disent, les deux seules solutions sont:Spring OpenSessionInViewInterceptor ne fonctionne pas

  • Faire la méthode transactionnelle (et ce n'est pas toujours souhaitable)
  • Utilisez OpenSessionInViewInterceptor.

Ce dernier est préférable OMI. Quoi qu'il en soit, je ne suis pas sûr que ce intercepteur tire du tout (en fait, je reçois la même exception de chargement Lazy et rien ne change):

org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: it.jsoftware.jacciseweb.beans.Listino.prodotti, no session or session was closed 

J'utilise mappages d'URL à base d'annotation simples, donc la lecture de la documentation pour Spring 3, je l'utilise dans mon servlet-context.xml:

<bean id="handlerMapping" 
     class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"> 
     <!-- <property name="order" value="2" /> --> 
     <property name="interceptors"> 
      <list> 
       <ref bean="openSessionInViewInterceptorInst" /> 
      </list> 
     </property> 
    </bean> 

Ce qui devrait faire l'affaire. Mais ça ne marche pas et j'ai l'exception. Comment puis-je m'assurer que mon intercepteur est en train de tirer? Comment puis-je résoudre ceci?

Répondre

15

Utilisez-vous l'annotation @RequestMapping? Si je me souviens bien, il y avait un problème avec la mise en place de l'intercepteur sur le haricot url. Avec Spring 3.0, vous pouvez définir l'intercepteur comme ceci:

<mvc:interceptors> 
    <bean class="org.springframework.orm.hibernate3.support.OpenSessionInViewInterceptor"> 
     <property name="sessionFactory"> 
      <ref local="sessionFactory" /> 
     </property> 
    </bean> 
</mvc:interceptors> 

en supposant que sessionFactory est une référence à votre grain de SessionFactory.

Vous devrez également inclure l'espace de noms mvc.

xmlns:mvc="http://www.springframework.org/schema/mvc" 
xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd" 
+1

Vos œuvres incantatoires, merci. Quoi qu'il en soit, pour l'avenir, comment puis-je m'assurer qu'un intercepteur tire et que ma config est correcte? Sinon, comme dans ces situations, il n'y a pas d'autre moyen de le savoir que de voir que je ne reçois plus l'exception. Doit être un moyen de déboguer cela ou de le connecter! – gotch4

+1

@ gotch4 Si vous activez la consignation de org.springframework dans DEBUG, vous pouvez le voir dans le fichier journal. –

+0

Comment est-ce que je fais cela avec précision? Désolé, je suis un débutant boiteux – gotch4

4

Essayez d'utiliser <mvc:interceptors>. Par ailleurs, @Transactional est une chose différente - cela ne fait pas fonctionner vos collections dans la "vue". Il ouvre simplement une transaction (et une session) pour la méthode annotée (et les méthodes qu'elle appelle)

0

Si vous utilisez Struts2 avec Spring et Hibernate, essayez d'utiliser OpenSesisonInViewFilter et lui attribuer dans web.xml

Questions connexes