Grails: Как проверить тело POST, состоящее из списка элементов, используя объект команды?
Я сталкиваюсь с некоторыми проблемами при написании пользовательских валидаторов (команд) в Grails 3.3.3. В частности, я пытаюсь проверить POST-запрос, тело которого состоит из списка элементов. Это то, что у меня есть...
Команда:
class VoteCommand implements Validateable {
List<VoteItem> postList = [].withLazyDefault { new ListItem() }
static constraints = {
postList nullable: false
}
class ListItem implements Validateable {
String tag
String some_id
static constraints = {
some_id nullable: false, blank: false
tag nullable: false, blank: false
tag inList: Tag.values() as List
}
}
}
И полезная нагрузка:
{
"noteVotesButWorks": [
{
"tag": "good"
},
{
"tag": "bad"
}
]
}
Эта полезная нагрузка проходит проверку проверки в моем действии контроллера.
def save(VoteCommand command) {
println(command.errors) //grails.validation.ValidationErrors: 0 errors
if (command.hasErrors()) {
respond params.errors, view: 'create'
} else {
withFormat {
'*' { render status: CREATED }
}
}
}
Сделав POST-запрос к этому действию, я получаю 201
а также grails.validation.ValidationErrors: 0 errors
печатается на стандартный вывод.
Пожалуйста, кто-нибудь может дать мне несколько советов?
2 ответа
Пожалуйста, кто-нибудь может дать мне несколько советов?
Ваша полезная нагрузка включает в себя ключ noteVotesButWorks
, Связыватель данных собирается создать экземпляр VoteCommand
а затем посмотрите, если есть noteVotesButWorks
свойство в этом экземпляре, и нет, поэтому связыватель данных не имеет ничего общего. Ваш VoteCommand
Затем экземпляр проверяется, что проходит, потому что ваше единственное ограничение postList nullable: false
, который проходит потому что postList
не является нулевым
Это все работает как задумано. Возможно, вы хотите, чтобы ключ в вашей карте полезной нагрузки совпадал с именем List
недвижимость в VoteCommand
,
Отдельно от всего этого, нет веских причин для включения .withLazyDefault { new ListItem() }
в вашей собственности инициализации. Вам действительно не нужно инициализировать свойство вообще. Связыватель данных сделает это за вас.
Я не думаю, что ты хочешь nullable: false
для postList. Пустой список не является нулевым. Я думаю ты хочешь minSize: 1
,