我有一个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.
答案 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)