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

时间:2013-06-10 20:18:01

标签: validation grails grails-2.0 grails-domain-class grails-validation

使用命令对象时:

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类。

我是否有办法为每个错误只有一个消息代码?

2 个答案:

答案 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)

  1. 在CommandObject中使用唯一约束是没有意义的,因为它会检查什么的唯一性?
  2. 您可以使用validate()方法
  3. 验证域对象,而不必与命令对象完全相同
  4. 您可以将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.