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

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


person Pila    schedule 11.04.2018    source источник
comment
Это не совсем связано с вашим вопросом, но у вас есть respond params.errors. Вы намеревались respond command.errors?   -  person Jeff Scott Brown    schedule 11.04.2018
comment
Также у вас есть блок withFormat, в котором есть только 1 случай, который является подстановочным знаком '*', поэтому withFormat ничего вам не покупает. Вы можете просто сделать тело вашего блока else render status: CREATED без приспособления withFormat и при этом вести себя точно так же.   -  person Jeff Scott Brown    schedule 11.04.2018


Ответы (2)


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

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

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

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

person Jeff Scott Brown    schedule 11.04.2018

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

person Daniel    schedule 11.04.2018
comment
Это как бы сработало, но не проверяет индивидуальность ListItems, просто проверяет размер списка votes - person Pila; 11.04.2018
comment
О, я не знал, что они тоже терпят неудачу. Глядя на это снова. Когда вы сохраните, что вы получите, если напечатаете command*.postList? Мне любопытно, преобразуется ли ваша полезная нагрузка в ListItems. - person Daniel; 11.04.2018