2011-05-12 72 views
0

我遇到了這個錯誤,當我嘗試設置lastLogin日期的事件偵聽Config.groovy上次登錄日期Grails中使用Spring Security

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

我似乎無法在我的測試環境複製這一點,但有一次我試了一下住在生產,我看到這個錯誤,並決定恢復。將變更保存到合併解決問題?

編輯:我能夠在我的測試環境中通過同時登錄同一用戶來複制錯誤。爲了進一步調試,我在事件處理程序中添加了一些打印語句並開始使用它。事實證明,當我簽署或任何人登錄到我的網站時,事件處理程序被調用MULTIPLE次,因此過時的對象異常。爲什麼onInteractiveAuthenticationSuccessEvent在登錄時被多次調用?

感謝, 裏卡多

+0

我會調查 - 什麼其他用戶字段可以登錄期間被寫入(也許這是一些後臺工作?)。 – 2011-05-12 07:58:15

回答

0

你要得到用戶的新副本在會議第一:

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

所以我能夠通過同時登錄同一個用戶,在我的測試環境中複製失敗。我嘗試了您的修復程序以獲取用戶的全新副本,但它仍會引發異常。 – Ricardo 2011-05-12 19:31:41

相關問題