gpt4 book ai didi

java - Grails,我如何获得一个不保存的对象

转载 作者:搜寻专家 更新时间:2023-10-30 21:22:34 24 4
gpt4 key购买 nike

我是 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 block 中设置断点,发现它按预期击中第一个 if 语句而不击中其他语句,所以它永远不会遇到对 save( ) 方法,但它还是被保存了。

经过一些研究后,我看到了 discard() 方法的文档,您可以在上面的代码中看到它的使用。所以我添加了这个但仍然无济于事。我什至尝试使用丢弃,然后再次从数据库重新加载客户端对象,但仍然没有成功。

这非常令人沮丧,我将不胜感激任何帮助,因为我认为这肯定不是一个复杂的要求!

最佳答案

Grails 在 Web 请求结束时关闭您的 Hibernate session ,这将清除已更改的对象。该对象已连接到您的 Hibernate session ,因为您通过 Hibernate (get()) 获取了它。如果您想避免更改被刷新,您需要使用 discard()

这是由失败的 validator 自动完成的,这就是为什么您不必为验证失败而这样做的原因。

但是,您可以通过将此逻辑移动到您的 ClientUser 字段之一上的自定义 validator 来简化代码,这将在失败时自动丢弃该对象,或者使用 Grails 命令对象,它也可以封装验证逻辑。然后您只需检查命令对象上的错误。

关于java - Grails,我如何获得一个不保存的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2908497/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com