当我试图用lastLogin中的事件侦听器设置Config.groovy日期时,我遇到了这个错误。
2011-05-12 00:30:16,501 "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在登录时不止一次被调用?
谢谢,里卡多
发布于 2011-05-12 18:42:42
首先,您需要在会话中获得用户的新副本:
grails.plugins.springsecurity.onInteractiveAuthenticationSuccessEvent = { e, appCtx ->
User.withTransaction {
def user = User.get(appCtx.springSecurityService.currentUser.id)
user.lastLogin = new Date()
user.save(flush: true)
}
} https://stackoverflow.com/questions/5973471
复制相似问题