Grails 圣杯虫?更新操作忽略拒绝值

Grails 圣杯虫?更新操作忽略拒绝值,grails,controller,Grails,Controller,我在Grails控制器内的更新操作中遇到问题 当我提交一个更改了密码(或其确认)的表单时,我希望对其进行验证,如果它没有得到很好的确认,我应该拒绝该表单并警告用户。我正试图按照Grails文档的说明来做这件事(http://grails.org/doc/latest/ref/Domain%20Classes/errors.html) 当我只更改密码或其确认时,一切正常 但是当我更改表单中的密码之后,问题就出现了,即使验证密码的块显然执行得很好,对象(userInstance)仍然会更新。并且,不

我在Grails控制器内的更新操作中遇到问题

当我提交一个更改了密码(或其确认)的表单时,我希望对其进行验证,如果它没有得到很好的确认,我应该拒绝该表单并警告用户。我正试图按照Grails文档的说明来做这件事(http://grails.org/doc/latest/ref/Domain%20Classes/errors.html)

当我只更改密码或其确认时,一切正常

但是当我更改表单中的密码之后,问题就出现了,即使验证密码的块显然执行得很好,对象(userInstance)仍然会更新。并且,不仅其他数据被持久化,而且是“错误确认”密码

我试图在下面的示例代码中插入一些“println”来说明发生了什么。我正在使用Grails2.0.0并在Intellij11.1.3中进行调试(如果有帮助的话)

我希望已经足够清楚了

谢谢你的回答

def update() {
   ...

   if (params.password != params.confirmPassword) {
      println("This message is correctly printed when passwords differ.")
      userInstance.errors.rejectValue('password',
                                      'defaut.password.diff.message',
                                      'Password confirmation is incorrect!')
      render(view: "edit", model: [userInstance: userInstance])
      return
   }

   println("This message is correctly NOT printed when passwords differ.")
   println("But 'userInstance' object is updated in DB anyways. :( ")

   if (!userInstance.save(flush: true)) {
      render(view: "edit", model: [userInstance: userInstance])
      return
   }

   flash.message = message(code: 'default.updated.message', args: [message(code: 'utilisateur.label', default: 'Utilisateur'), utilisateurInstance.id])
   redirect(action: "show", id: utilisateurInstance.id)
}

我认为您的
userInstance
已保存,因为操作成功后会自动刷新。如果密码不匹配,请尝试在return语句之前使用
userInstance.discard()
。通过这种方式,您可以将此实例从Hibernate中分离出来,并且在执行某个操作后它将不会被保存。

谢谢Tomasz!就是这样。