2010-10-16 7 views
2

J'ai HttpSessionListener pour savoir quand les sessions sont créées et détruites. J'ai un domaine d'utilisateur qui a la colonne booléenne de loggedIn que je met à jour chaque fois que l'utilisateur se connecte ou déconnecte que j'utilise pour la gestion d'admin. Je stocke également l'identifiant de session dans la base de données.Grails 1.3.5: Mise à jour de la table utilisateur lorsque la session est détruite

Je souhaite également mettre à jour la colonne loggedIn chaque fois que la session est détruite. Voici le code écrit dans la méthode sessionDestroyed.

def user = User.findByUserSessionId(session.getId()) 
if(user) {  
    user.setLoggedIn(false) 
    user.setUserSessionId("SESSION DESTROYED") 
    user.save(flush: true)  
} 

Le problème est que la table utilisateur n'est jamais mise à jour.

Ci-dessous est l'erreur signalée dans le fichier journal:

  [2010-10-16 11:45:07.781] ERROR core.ContainerBase.[Tomcat].[localhost].[/SAMPLE] Session event listener threw exception 
     org.hibernate.HibernateException: No Hibernate Session bound to thread, and configuration does not allow creation of non-transactional one here 
      at org.springframework.orm.hibernate3.SpringSessionContext.currentSession(SpringSessionContext.java:63) 
      at org.hibernate.impl.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:574) 
      at org.codehaus.groovy.grails.orm.hibernate.validation.HibernateDomainClassValidator.validate(HibernateDomainClassValidator.java:66) 
      at org.codehaus.groovy.grails.orm.hibernate.metaclass.AbstractSavePersistentMethod.doInvokeInternal(AbstractSavePersistentMethod.java:129) 
      at org.codehaus.groovy.grails.orm.hibernate.metaclass.AbstractDynamicPersistentMethod.invoke(AbstractDynamicPersistentMethod.java:59) 
      at sun.reflect.GeneratedMethodAccessor500.invoke(Unknown Source) 
      at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
      at java.lang.reflect.Method.invoke(Method.java:597) 
      at org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite$PojoCachedMethodSite.invoke(PojoMetaMethodSite.java:188) 
      at org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite.call(PojoMetaMethodSite.java:52) 
      at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:132) 
      at org.codehaus.groovy.grails.plugins.orm.hibernate.HibernatePluginSupport$_addBasicPersistenceMethods_closure71.doCall(HibernatePluginSupport.groovy:812) 

Puis-je savoir comment la bonne façon de mettre à jour la table utilisateur lors de la session est détruite.

Merci. Jay Chandran.

Répondre

2

essayer

User.withTransaction{ txStatus -> .... } 

ou

User.withSession{ session - > .... } 

ou peut-être injecter un service qui fait ce que vous avez besoin de faire, car les méthodes de service devraient avoir des transactions par défaut. Edit - habituellement je ne vais pas si loin, mais je suis de bonne humeur aujourd'hui ... quelque chose comme ce qui suit devrait fonctionner. Vous devriez vraiment lire la documentation de grails ou acheter un livre ...

User.withTransaction(txStatus -> 
    def user = User.findByUserSessionId(session.getId()) 
    if(user) {  
     user.setLoggedIn(false) 
     user.setUserSessionId("SESSION DESTROYED") 
     user.save(flush: true)  
    } 
} 
+0

@jay thats complètement illisible. Veuillez mettre à jour votre question initiale ou en créer une nouvelle. – hvgotcodes

+0

Désolé pour le commentaire précédent. Je n'ai pas pu le mettre en forme correctement. –

+0

@jay, vous ne pouvez pas mettre en forme du code dans les commentaires. Mettez à jour votre question avec la nouvelle erreur ou commencez une nouvelle question. On dirait que vous avez progressé parce que l'exception a changé. – hvgotcodes