Могут ли объекты команд Grails иметь переменное количество параметров?

Мы используем Командные объекты с контроллерами Grails в Grails 2.0.1. Это фантастическая функция, благодаря которой появились очень хорошие, лаконичные контроллеры с полностью проверенными параметрами. У меня есть случай, когда в контроллере реализован вызов веб-службы, где есть несколько фиксированных параметров, а затем несколько параметров переменной длины. Я погуглил повсюду и не могу найти пример. Документы Grails довольно кратки по командным объектам в целом. Я могу делать то, что хотел бы, без объектов Command, но тогда я бы нарушил шаблон в этом наборе контроллеров, где каждый другой вызов использует объект Command. FWIW этот конкретный вызов представляет собой POST, который передает данные в бэкэнд. Здесь нет объекта Domain, данные преобразуются в строку в электронной таблице. Конечно, мы могли бы создать объект Domain для моделирования данных, но я не уверен, поможет ли это каким-либо образом решить проблему.

Я не уверен, что пример кода поможет, но в любом случае вот один:

package com.companyname.platform.api

    class ApiController {
        static allowedMethods = [save:'POST', close:'POST', storeResults: 'POST']

        def save = { APISaveCommand cmd->
            doSaveAction(cmd)
        }
        def close = APICloseCommand cmd->
            doCloseAction(cmd)
        }
        def storeResults = { params->
            doStoreResults(params)
        }
    }
}

Видите, как storeResults не имеет объекта Command? Требуется переменное количество параметров. В приведенном выше коде предположим, что методы do*Action находятся в службе, которая была внедрена в этот контроллер. Нет ничего плохого в doStoreResults(params), но я бы очень хотел придерживаться шаблона объекта команды.

1 ответ

Согласно вашему комментарию, да, в этом случае можно использовать команды. Juts объявляет все поля в команде и реализует пользовательские валидаторы для полей, которые должны быть объявлены парами.

В валидаторе у вас есть доступ к значению поля, а также к экземпляру объекта, так что вы можете легко сравнить, является ли одно из них нулевым, а другое ненулевым.

@Validateable
class MyCommand {
  String a
  String b
  String c

  static constraints = {
    a nullable: false, blank: false
    b validator: { val, obj ->
      if((!val && obj.c) || (val && !obj.c)) {
        return 'mycommand.declareBAndC.message' //key to the i18n message
      }
    }
  }

}
Другие вопросы по тегам