使用spring security的grails中的最后登录日期

使用spring security的grails中的最后登录日期,grails,spring-security,grails-plugin,Grails,Spring Security,Grails Plugin,当我试图在Config.groovy中使用事件侦听器设置lastLogin日期时,遇到了这个错误: 2011-05-12 00:30:16501[“ajp-bio-8009”-exec-6]错误 events.PatchedDefaultFlushEventListener-无法同步 会话为org.hibernate.StaleObjectStateException的数据库状态: 行被另一个事务(或未保存的值)更新或删除 映射不正确):[spl.User#110] 我的代码: grails.p

当我试图在
Config.groovy
中使用事件侦听器设置
lastLogin
日期时,遇到了这个错误:

2011-05-12 00:30:16501[“ajp-bio-8009”-exec-6]错误 events.PatchedDefaultFlushEventListener-无法同步 会话为org.hibernate.StaleObjectStateException的数据库状态: 行被另一个事务(或未保存的值)更新或删除 映射不正确):[spl.User#110]

我的代码:

grails.plugins.springsecurity.onInteractiveAuthenticationSuccessEvent = { e, appCtx ->
    User.withTransaction {
        def user = appCtx.springSecurityService.currentUser
        user.lastLogin = new Date()
        user.save(flush: true)
    }
}
我似乎无法在我的测试环境中复制它,但有一次我在生产环境中尝试了它,我看到了这个错误并决定恢复。将“保存”更改为“合并”会解决此问题吗

编辑:我可以通过同时以同一用户身份登录,在测试环境中复制错误。为了进一步调试,我在事件处理程序中添加了一些print语句,并开始使用它。事实证明,当我或任何人登录到我的站点时,事件处理程序会被多次调用,从而导致陈旧的对象异常。为什么在登录时会多次调用onInteractiveAuthenticationSuccessEvent?

谢谢,
Ricardo

您首先需要在会话中获取用户的新副本:

grails.plugins.springsecurity.onInteractiveAuthenticationSuccessEvent = { e, appCtx ->
    User.withTransaction {
        def user = User.get(appCtx.springSecurityService.currentUser.id)
        user.lastLogin = new Date()
        user.save(flush: true)
    }
} 

我会调查-在登录期间可以写入哪些其他用户字段(可能是一些后台工作?),因此我能够通过同时与同一用户登录,在测试环境中复制失败。我尝试了您的修复程序以获取用户的新副本,但它仍然抛出异常。