java – Grails,我如何得到一个对象不保存

前端之家收集整理的这篇文章主要介绍了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命令对象.那么你只需检查命令对象的错误.

猜你在找的Java相关文章