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
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() } в инициализацию вашего свойства. Вам вообще не нужно инициализировать свойство. Связующее устройство данных сделает это за вас.

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