Пользовательские объекты команды Grails Проверка кодов сообщений

При использовании командных объектов, таких как:

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 ответа

Решение

Я могу ошибаться, но если вы используете только стандартные ограничения Grails, единственный способ поделиться сообщением проверки - просто положиться на default.x.x.message ключ / значения в messages.properties. В противном случае сообщения ищутся через следующую форму ключа:

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'
    }
  }
}

Затем вы можете сохранить все СУХОЕ, разделяя ограничения между классами через глобальное ограничение или, как упоминалось в @dmahapatro, с использованием importFrom в вашей UserCommand вот так,

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. использование уникальных ограничений в CommandObject не имеет смысла, потому что уникальность того, что он будет проверять?
  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.
    
Другие вопросы по тегам