Могут ли объекты команд 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
}
}
}
}