如果一个验证失败,我如何阻止Grails进行任何进一步的验证?

时间:2013-05-17 02:30:05

标签: validation grails

我有一个Grails命令对象,我用它来更新密码。它看起来像这样:

class UpdatePasswordCommand {

    String password

    static constraints = {
        password blank: false,
                 nullable: false,
                 size: 8..64,
                 matches: someLongRegex
                 validator: { String password, command ->
                     if (someService.isPasswordSameAsUsername(password)) {
                         return 'password.invalid.sameasuser'
                     }
    }

我遗漏了与我问的问题无关的一切。

我遇到的问题是,每当此验证触发时,它将触发所有验证,command.errors集合将针对每个验证失败发出错误消息。这意味着,例如,如果用户尝试使用测试作为密码,他们将收到以下错误消息:

* Password length must be between 8 and 64 characters.
* Password must not be the same as the user name.
* Password must contain at least one special character, uppercase letter, and digit.

在这种情况下,如果密码长度错误,我希望验证在此时停止。同样,如果它与用户名相同,我不希望它检查正则表达式。有什么方法可以让Grails验证只返回特定属性的第一次验证失败?请注意,重要的是我只希望它停止每个属性,因为如果用户没有输入他的确认密码,例如,我仍然想显示两条错误消息:

* Password length must be between 8 and 64 characters.
* You must enter a confirm password.

2 个答案:

答案 0 :(得分:0)

这不应该是以抢先的方式向用户提供所有验证消息的做法,以便用户可以一次性纠正或处理它们,而不是逐一纠正它们吗?

但无论如何,您可以通过编程强制一次只返回一条消息,如下所示:

    static constraints = {
        password validator: { String password, command ->
                    def errorMsgs = []
                    if (!password){
                        errorMsgs << 'password.invalid.blank' //'password.invalid.null'
                        return errorMsgs
                    } else if (!(password.size() in (8..64))){
                        if (someService.isPasswordSameAsUsername(password)){
                            errorMsgs << 'password.invalid.sameasuser'
                        }
                        errorMsgs << 'password.invalid.length'
                        return errorMsgs
                    } else if (/*password not matching YourRegex*/){
                        errorMsgs << 'password.invalid.specialCharacters'
                        return errorMsgs
                    } else if (someService.isPasswordSameAsUsername(password)){
                        errorMsgs << 'password.invalid.sameasuser'
                        return errorMsgs
                    }
            }
    }

我认为我们必须通过添加控制逻辑来处理发回多条消息的特殊情况,如上所述,密码长度及其与用户名的匹配。

答案 1 :(得分:0)

看一下grails validate,有趣的是你可以将属性名称传递给validate()
第二件事是实现spring errors接口的Errors属性。您可以使用它来清理消息,只显示一个属性。
写一个自定义验证器,因为dmahapatro建议这是一个很好的方法。