Значение Grails 3.3.10, установленное в доменном методе, не сохраняется - PullRequest
0 голосов
/ 21 октября 2019

У меня есть класс User с атрибутом resetPasswordToken, который представляет собой 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, а resetPasswordToken равен NULL в базе данных после вызова действия ForgotPassword. Если я выполню println после вызова user.setPasswordToken (), я увижу, что resetPasswordToken имеет значение UUID, но его нет в БД. Также проверяется на ошибки при сохранении, и ошибок нет.

Странная вещь, если я сделаю user.resetPasswordToken = "xxxx" в контроллере, значение будет сохранено в базе данныхправильно.

Не уверен, что происходит, если значение, установленное в setPasswordToken (), не сохраняется в БД. Есть указатели?

1 Ответ

2 голосов
/ 21 октября 2019

См. Комментарий на 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
    }
}

Если вы действительно хотите включить старый способ грязной проверки, вы можете сделать это согласно инструкциям в комментарии, который я связалвыше, но следует помнить о снижении производительности при этом. Рекомендуемый подход заключается в том, чтобы использовать установщик или явно пометить свойство как грязное, используя метод markDirty.

Надеюсь, это поможет.

...