1

我有一个用于更新密码的 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集合将为每个验证失败提供一条错误消息。这意味着,例如,如果用户尝试使用test作为密码,他们将收到以下错误消息:

* 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.
4

2 回答 2

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
                    }
            }
    }

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

于 2013-05-17T03:36:05.723 回答
0

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

于 2013-05-17T22:59:57.640 回答