Дата последнего входа в Grails с весенней безопасностью - PullRequest
0 голосов
/ 12 мая 2011

Я сталкиваюсь с этой ошибкой при попытке установить дату 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 вызывается более одного раза при входе в систему?

Спасибо, Рикардо

1 Ответ

0 голосов
/ 12 мая 2011

Сначала вы захотите получить свежую копию пользователя в сеансе:

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