当使用命令对象时,如:
class UserCommand {
String name
static constraints = {
name blank: false, unique: true, minSize: 3
}
}
可以使用它们来验证对象,而不需要将它们持久化。在我的例子中,我将验证持久类User。
In controller:
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类。
是否有一种方法,我可以只有一个消息代码为每个错误?
我可能在这里错了,但是如果您只使用常规Grails约束,那么共享验证消息的唯一方法就是简单地依赖于messages.properties中的default.x.x.message
键/值。否则,消息将通过以下键形式查找:
className.propertyName.errorcode...=
但是,您可以使用自定义验证器并覆盖为验证错误返回的消息键。class User {
...
static constraints = {
...
name blank: false, unique: true, validator: { value, user ->
if(!value || value.length() < 3)
return 'what.ever.key.in.messages.properties'
}
}
}
然后你可以通过全局约束在类之间共享约束来保持所有的DRY,或者像@dmahapatro提到的那样,在你的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
- 在commanddobject中使用唯一约束是没有意义的,因为唯一性会检查什么?
- 您可以验证域对象,而不必像保存命令对象那样将它们持久化—使用validate()方法
-
您可以在命令对象中放置一个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.