【问题标题】:Grails 3.3.10 value set in domain method is not being saved域方法中设置的 Grails 3.3.10 值未保存
【发布时间】: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


【解决方案1】:

请参阅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 方法将属性显式标记为脏。

希望对你有帮助。

【讨论】:

  • 在我的自定义设置器中使用 setXXX 工作正常!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-07
  • 1970-01-01
相关资源
最近更新 更多