java – Grails,我如何得到一个对象不保存
我是新的grails,并尝试创建一个表单,允许用户更改与他/她的帐户相关联的电子邮件地址,我正在创建一个网站.
它要求用户他们当前的密码以及他们想要使用的新电子邮件地址. 现在,电子邮件验证可以通过grails中的限制来完成,但密码更改必须与其当前密码相匹配.我已经将此检查实现为服务类上的方法. 见下面的代码: def saveEmail = { def client = ClientUser.get(session.clientUserID) client.email = params.email if(clientUserService.checkPassword(session.clientUserID,params.password) ==false) { flash.message = "Incorrect Password" client.discard() redirect(action:'changeEmail') } else if(!client.validate()) { flash.message = "Invalid Email Address" redirect(action:'changeEmail') } else { client.save(); session.clientUserID = null; flash.message = "Your email address has been changed,please login again" redirect(controller: 'clientLogin',action:'index') } } 现在我注意到这是奇怪的是,如果我输入了一封无效的电子邮件,那么它不会保存更改(如预期),但是如果输入错误的密码和有效的电子邮件,那么它将保存更改,甚至将其写回数据库,即使它会给出正确的“无效密码”错误消息. 我在所有if / else if / else块中设置了断点,并发现它是按预期的方式击中第一个if语句,而不是碰到其他的,所以它永远不会调用save()方法,不过还是得救了 经过一番研究,我得到了可以看到在上面代码中使用的discard()方法的文档.所以我补充说,但还是没有用.我甚至尝试使用丢弃,然后从数据库重新加载客户端对象,但仍然没有骰子. 这是非常令人沮丧的,我会感谢任何帮助,因为我认为这肯定不是一个复杂的要求! 解决方法
Grails在Web请求结束时关闭您的Hibernate会话,这将刷新已更改的对象.该对象连接到您的Hibernate会话,因为您通过Hibernate(get())保持它.如果要避免更改刷新,则需要使用discard().
这是由失败的验证器自动完成的,这就是为什么您不必为验证失败而做的. 然而,您可以通过将此逻辑移动到您的一个ClientUser字段上的自定义验证器来简化代码,这会在失败时自动丢弃该对象,或者使用还可以封装验证逻辑的Grails命令对象.那么你只需检查命令对象的错误. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |