我的用户域有一个名为'lastLogin'的字段,我想在登录后更新(self-exaplantoy)。 重新启动tomcat(dev env)后,我得到以下异常:
groovy.lang.MissingMethodException:没有方法签名:static photoo.user.User.findById()适用于参数类型:(java.lang.Long)values:[2]可能的解决方案:findAll( groovy.lang.Closure),find(groovy.lang.Closure)
我在Config.groovy中使用以下代码:
// callback event, after a successful login
grails.plugins.springsecurity.onInteractiveAuthenticationSuccessEvent = { e, appCtx ->
def user = User.findById(appCtx.springSecurityService.principal.id)
User.withTransaction {
if(!user.isAttached())
user.attach()
user.lastLogin = new Date()
user.save(flush: true)
}
}
如何避免异常,为什么会发生? THX
答案 0 :(得分:3)
最后我发现了这个错误。在withTransaction-block中加载用户是解决方案。
// dont load before
// def user = User.findById(appCtx.springSecurityService.principal.id)
User.withTransaction {
def user = User.findById(appCtx.springSecurityService.principal.id)
if(!user.isAttached())
user.attach()
user.lastLogin = new Date()
user.save(flush: true, failOnError: true)
}
答案 1 :(得分:1)
您可能只需要使用User.get()。这就是我所拥有的:
onInteractiveAuthenticationSuccessEvent = { e, appCtx ->
// handle AuthenticationSuccessEvent
def autservice = appCtx.authenticateService
def user = autservice.userDomain()
println "user: ${user.id}:${user}}"
def request = org.codehaus.groovy.grails.plugins.springsecurity.SecurityRequestHolder.getRequest()
def session = request.getSession(false)
if (user) {
def person = Person.get(user.id)
def lang = person.preferredLanguage
if (session) {
session.lang = lang
}
}
}