gpt4 book ai didi

validation - Grails 2.2.0 - 验证问题

转载 作者:行者123 更新时间:2023-12-02 15:33:57 25 4
gpt4 key购买 nike

我有一个包含 3 个字段的组域对象 - 用户名、密码和电子邮件地址
在保存对象之前,我混淆了电子邮件地址,因此它不会以明文形式存储在我们的数据库中作为业务需求

当我在域对象上调用 validate 时,我注意到了一些奇怪的行为。
字段的约束如下

    userName (nullable: false, unique: false,blank: false, size: 4..200,widget: "textField", matches: "[a-zA-Z0-9, .-@#~{}!£%&*^()-_]+")
password (nullable: false, unique: false,blank: false, size: 4..200,widget: "textField", password: true, matches: "[a-zA-Z0-9, .-@#~{}!£%&*^()-_]+")
emailAddress (nullable: false, unique: false,blank: false, size: 5..200,widget: "textField",email: true, matches: "[a-zA-Z0-9, .-@#~{}!£%&*^()-_]+")

对于该对象,我对其进行验证以确保所有值都符合预期(emailAddress 尚未混淆)
如果有效,我会混淆电子邮件地址,然后使用 validate: false 值调用 save

奇怪的行为如下
如果我填写了有效的电子邮件地址和有效的密码 - 对象在用户名字段上的验证失败,因为它不能为空

如果我填写了一个有效的电子邮件地址和一个有效的用户名 - 该对象在密码字段上的验证失败,因为它不能为空,在电子邮件地址上也是如此,它在消息中显示电子邮件地址的混淆值

我首先认为是混淆导致了问题,但在输入密码字段的情况下它工作正常
对于这两种情况,它的代码流完全相同。

在我混淆电子邮件地址后未填写密码字段的情况下,grails 是否有可能调用 validate 方法?

代码流程如下
        def userLoginUserInstance = UserLoginUser.get(params.id)
userLoginUserInstance.properties = params

if (userLoginUserInstance.validate()) {
//perform updates to database by obfuscating email address first - working fine
} else {
def newObfuscatedEmailAddress = userLoginUserInstance.emailAddress.encodeAsBase64();

userLoginUserInstance.setEmailAddress(newObfuscatedEmailAddress);

render(view: "edit", model: [userLoginUserInstance: userLoginUserInstance])
}

验证失败时电子邮件地址被混淆的原因是 gsp 读取了一个 transient 变量,该变量具有一个 getter,而不是对电子邮件地址进行去混淆处理。当上面的代码在未设置用户名的情况下运行时,它可以正常工作并且电子邮件地址显示为正常。
如果密码为空,则会显示密码错误,但混淆的电子邮件地址也会显示为无效。

在进一步分析中,当我运行以下代码行时发生了验证问题
 userLoginUserInstance.setEmailAddress(newObfuscatedEmailAddress);

我理解为什么会在从数据库中检索 userLoginUserInstance 时发生这种情况。
让我感到困惑的是,这并非在所有情况下都会发生

最佳答案

发生验证错误是因为您尝试存储 Base64将字符串转换为具有电子邮件约束的属性:

"foo@bar.com".encodeAsBase64()

结果是
Zm9vQGJhci5jb20=

所以现在当你的 User实体再次刷新到数据库当然正在发生另一个验证,提示这不是有效的电子邮件地址。

并非在所有情况下都出现验证错误的原因可能是您没有强制执行 user.save()也不是 user.save(flush:true) .

这意味着电子邮件地址不会临时更新,而是稍后更新。为了更好地了解发生了什么,在分配电子邮件后添加另一个验证 block 。

关于validation - Grails 2.2.0 - 验证问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14815703/

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