【发布时间】:2019-10-22 00:17:58
【问题描述】:
我有一个带有 resetPasswordToken 属性的 User 类,这是用户尝试重置密码时设置的 UUID。
在 Grails 2.5.6 上,我有类似的东西可以正常工作:
class UserController {
def forgotPassword(String email)
{
...
def user = User.findByEmail(email)
user.setPasswordToken()
user.save(flush: true()
...
}
}
class User {
...
String resetPasswordToken
static transients = ['passwordToken']
def setPasswordToken()
{
...
this.resetPasswordToken = (java.util.UUID.randomUUID() as String)
}
}
现在我将它迁移到 GRails 3.3.10,并且在调用 forgotPassword 操作后,数据库上的 resetPasswordToken 为 NULL。如果在调用 user.setPasswordToken() 后执行 println,我可以看到 resetPasswordToken 设置为 UUID,但不在数据库中。还检查了保存的错误,没有错误。
奇怪的是,如果我在控制器中执行 user.resetPasswordToken = "xxxx",值会正确保存到数据库中。
不确定 setPasswordToken() 中设置的值未保存到数据库中的情况。有什么指点吗?
【问题讨论】:
-
在github.com/grails/grails-data-mapping/issues/… 上查看 Graeme 的回答。
-
我是否因为使用自己的设置器而错过了脏检查?
-
“我是否因为使用自己的设置器而错过了脏检查?” - 并不真地。问题是您的二传手 (
setPasswordToken) 正在使用this.resetPasswordToken = (java.util.UUID.randomUUID() as String)进行字段访问。如果那是setResetPasswordToken((java.util.UUID.randomUUID() as String)),我希望它可以工作。因为脏检查在setResetPasswordToken方法中,你没有使用它。 -
太棒了!很高兴我能帮上忙。
-
不相关,但如果您将
setPasswordToken方法名称更改为更具体的renewThePasswordToken,您可以避免声明瞬态
标签: grails grails-3.3