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



当使用命令对象时,如:

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

  1. 在commanddobject中使用唯一约束是没有意义的,因为唯一性会检查什么?
  2. 您可以验证域对象,而不必像保存命令对象那样将它们持久化—使用validate()方法
  3. 您可以在命令对象中放置一个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.
    

相关内容

  • 没有找到相关文章

最新更新