我是grails的初学者,但我遇到以下问题。请帮忙。
包跑马场
类用户{
String userName
String password
static constraints = {
userName(nullable:false, maxSize:20)
password(password:true, minSize: 8,
validator: {
return (it.matches("(.*[\\d])"))?true: ['noNumber']
return (it.matches("(.*[\\W])"))?true: ['noSpecialCh']
return (it.matches("(.*[a-z])"))?true: ['noLower']
return (it.matches("(.*[A-Z])"))?true: ['noUpper']
}
)
}
}
我创建了上述域,并在message.properties中添加了以下内容:
users.password.validator.noNumber =应至少包含一个数字
users.password.validator.noLower =也应至少包含一个小写字母
users.password.validator.noUpper =也应该包含数字
users.password.validator.noSpecialCh =也应包含数字
但是,尝试使用错误的值时,我没有得到必填消息。假设,如果我在密码中没有给出任何数字,则应该收到“应至少包含一个数字”消息,但我只能得到与自定义验证消息不匹配的消息。
最佳答案
核心问题在于,与Java不同,Groovy允许多个return
语句。如果将其转换为Java,它将无法编译。
Groovy允许使用多个return
语句,但显然仅考虑第一个,因此对于您的代码,您只有一个检查,而不是四个检查
(it.matches("(.*[\\d])")) ? true : ['noNumber']
应该是这样的:
if (!it.matches("(.*[\\d])")) {
return ['noNumber']
}
if (!it.matches("(.*[\\W])")) {
return ['noSpecialCh']
}
if (!it.matches("(.*[a-z])")) {
return ['noLower']
}
if (!it.matches("(.*[A-Z])")) {
return ['noUpper']
}
除了所有正则表达式均已损坏之外,但这是一个单独的问题。
关于validation - 尝试以下操作时,为什么自定义消息无法正常使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32163766/