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, напечатанные на стандартный вывод.

Пожалуйста, кто-нибудь может дать мне несколько указателей?

Это не совсем связано с вашим вопросом, но у вас есть respond params.errors. Ты имел ввиду respond command.errors?

Jeff Scott Brown 11.04.2018 18:29

Также у вас есть блок withFormat только с одним корпусом, который является шаблоном подстановки '*', поэтому withFormat вам ничего не купит. Вы можете просто сделать корпус вашего блока elserender status: CREATED без приспособления withFormat и при этом вести себя точно так же.

Jeff Scott Brown 11.04.2018 18:30
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
153
2

Ответы 2

Я не думаю, что вам нужен nullable: false для postList. Пустой список не равен нулю. Думаю, тебе нужен minSize: 1.

Это вроде работало, но не проверяет индивидуальный ListItems, просто проверяет размер списка votes.

Pila 11.04.2018 17:20

О, я не понимал, что они тоже терпят неудачу. Глядя на это снова. Что вы получите при сохранении, если напечатаете команду * .postList? Мне любопытно, конвертируется ли ваша полезная нагрузка в ListItems.

Daniel 11.04.2018 17:26

Please, can someone here give me some pointers?

Ваша полезная нагрузка включает ключ noteVotesButWorks. Связыватель данных создаст экземпляр VoteCommand, а затем проверит, есть ли свойство noteVotesButWorks в этом экземпляре, а его нет, поэтому связыватель данных на самом деле не имеет ничего общего. Затем ваш экземпляр VoteCommand проходит валидацию, которая проходит, потому что ваше единственное ограничение - postList nullable: false, которое проходит, потому что postList не является нулевым.

Все работает так, как задумано. Вероятно, вы хотите, чтобы ключ в вашей карте полезной нагрузки совпадал с именем свойства List в VoteCommand.

Помимо всего этого, нет веских причин для включения .withLazyDefault { new ListItem() } в инициализацию вашего свойства. Вам вообще не нужно инициализировать свойство. Связующее устройство данных сделает это за вас.

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