使用命令对象时:
class UserCommand {
String name
static constraints = {
name blank: false, unique: true, minSize: 3
}
}
您可以使用它们来验证对象,而不会使它们持久化。在我的情况下,我将验证持久类User。
在控制器中:
def save(UserCommand cmd) {
if(!cmd.validate()) {
render view: "create", model: [user: cmd]
return
}
def user = new User()
user.name = cmd.name
user.save()
redirect uri: '/'
}
在messages.properties中:
user.username.minSize.error=Please enter at least three characters.
userCommand.username.minSize.error=Please enter at least three characters.
使用自定义验证消息时,您必须为每个错误编写两次消息代码。一个用于User类,另一个用于UserCommand类。
我是否有办法为每个错误只有一个消息代码?
答案 0 :(得分:4)
我可能在这里错了,但是如果你只使用Grails约束,那么共享验证消息的唯一方法就是简单地依赖messages.properties中的default.x.x.message
键/值。否则,将通过以下密钥形式查找消息:
className.propertyName.errorcode...=
但是,您可以使用custom validator并覆盖为验证错误返回的消息密钥。
class User {
...
static constraints = {
...
name blank: false, unique: true, validator: { value, user ->
if(!value || value.length() < 3)
return 'what.ever.key.in.messages.properties'
}
}
}
然后你可以通过global constraint或者@dmahapatro在类之间共享约束来保持所有DRY,在你的UserCommand中使用importFrom
就像这样,
class UserCommand {
...
static constraints = {
importFrom User
...
}
}
如果您有更复杂的验证,则可以创建自己的约束类。以下是一些资源:
http://www.zorched.net/2008/01/25/build-a-custom-validator-in-grails-with-a-plugin/ http://blog.swwomm.com/2011/02/custom-grails-constraints.html
答案 1 :(得分:1)
您可以将User对象放在命令对象中,仅为域类设置约束,然后验证作为命令对象一部分的User对象
class User {
String name
static constraints = {
name blank: false, unique: true, minSize: 3
}
}
class UserCommand {
User user
static constraints = {
user validator: { it.validate() }
}
}
user.username.minSize.error=Please enter at least three characters.