Grails 1.3.5: обновление пользовательской таблицы, когда сеанс уничтожен - PullRequest
2 голосов
/ 16 октября 2010

У меня есть HttpSessionListener для прослушивания, когда сеансы создаются и уничтожаются.У меня есть пользовательский домен с логическим столбцом loggedIn, который я обновляю всякий раз, когда пользователь входит в систему или выходит из системы, который я использую для административного управления.Я также храню идентификатор сеанса в базе данных.

Я также хочу обновлять столбец loggedIn всякий раз, когда сеанс уничтожается.Ниже приведен код, написанный в методе sessionDestroyed.

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

Проблема в том, что таблица пользователей никогда не обновляется.

Ниже приведена ошибка, сообщенная в файле журнала:

            [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)

Могу ли я узнать, как правильно обновлять пользовательскую таблицу, когда сеанс уничтожается.

Спасибо.Джей Чандран.

1 Ответ

2 голосов
/ 16 октября 2010

попробуй

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

или

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

или, возможно, внедрить службу, которая делает то, что вам нужно, поскольку методы службы должны иметь транзакции по умолчанию.

edit - обычно я не захожу так далеко, но у меня сегодня хорошее настроение ... что-то вроде следующего должно работать. Вы действительно должны прочитать документацию Grails или купить книгу ...

User.withTransaction( txStatus -> 
    def user = User.findByUserSessionId(session.getId())
    if(user) {      
       user.setLoggedIn(false)
       user.setUserSessionId("SESSION DESTROYED")
       user.save(flush: true)      
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...