0

我有一个带有 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() 中设置的值没有保存到数据库中发生了什么。任何指针?

4

1 回答 1

2

请参阅https://github.com/grails/grails-data-mapping/issues/961#issuecomment-309379214上的评论。您遇到的问题是脏检查之一,它在 GORM 6.1 中发生了变化。

考虑这段代码...

class Person {
    String name
    String email

    void updateName(String newName) {
        this.name = newName
    }

    static constraints = {
        email email: true
    }
}

updateName方法不会导致name属性被标记为脏。以下代码将导致该name属性被标记为脏:

class Person {
    String name
    String email

    void updateName(String newName) {
        setName newName
    }

    static constraints = {
        email email: true
    }
}

如果您真的想打开旧的脏检查方法,您可以按照我上面链接的评论中的说明进行操作,但请注意这样做会降低性能。推荐的方法是使用 setter 或使用该markDirty方法将属性显式标记为脏。

我希望这会有所帮助。

于 2019-10-21T16:17:58.100 回答