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,

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