Grails命令对象自定义验证消息代码

con*_*ile 5 validation grails grails-validation grails-domain-class grails-2.0

使用命令对象时:

class UserCommand {

   String name

   static constraints = {
      name blank: false, unique: true, minSize: 3
   }
}
Run Code Online (Sandbox Code Playgroud)

您可以使用它们来验证对象,而不会使它们持久化.在我的情况下,我将验证持久类用户.

在控制器中:

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: '/'

} 
Run Code Online (Sandbox Code Playgroud)

在messages.properties中:

user.username.minSize.error=Please enter at least three characters.
userCommand.username.minSize.error=Please enter at least three characters.
Run Code Online (Sandbox Code Playgroud)

使用自定义验证消息时,您必须为每个错误编写两次消息代码.一个用于User类,另一个用于UserCommand类.

有没有办法我每个错误只能有一个消息代码?

iku*_*men 5

我在这里可能是错误的,但是如果您仅使用普通Grails约束,则共享验证消息的唯一方法是仅依赖default.x.x.messagemessages.properties中的键/值。否则,通过以下键形式查找消息:

className.propertyName.errorcode...=
Run Code Online (Sandbox Code Playgroud)

但是,您可以使用自定义验证程序,并覆盖为验证错误返回的消息密钥。

class User {
  ...

  static constraints = {
    ...
    name blank: false, unique: true, validator: { value, user ->
      if(!value || value.length() < 3)
        return 'what.ever.key.in.messages.properties'
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以通过全局约束或@dmahapatro提到的类之间共享约束来保持所有DRY ,并在UserCommand中使用,importFrom例如

class UserCommand {
 ...
 static constraints = {
   importFrom User
   ...
  }
}
Run Code Online (Sandbox Code Playgroud)

如果您具有更复杂的验证,则可以创建自己的约束类。以下是一些资源:

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