Я столкнулся с некоторыми проблемами при написании пользовательских валидаторов (команд) в 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
, напечатанные на стандартный вывод.
Пожалуйста, кто-нибудь может дать мне несколько указателей?
Также у вас есть блок withFormat
только с одним корпусом, который является шаблоном подстановки '*'
, поэтому withFormat
вам ничего не купит. Вы можете просто сделать корпус вашего блока else
render status: CREATED
без приспособления withFormat
и при этом вести себя точно так же.
Я не думаю, что вам нужен nullable: false
для postList. Пустой список не равен нулю. Думаю, тебе нужен minSize: 1
.
Это вроде работало, но не проверяет индивидуальный ListItems
, просто проверяет размер списка votes
.
О, я не понимал, что они тоже терпят неудачу. Глядя на это снова. Что вы получите при сохранении, если напечатаете команду * .postList? Мне любопытно, конвертируется ли ваша полезная нагрузка в ListItems.
Please, can someone here give me some pointers?
Ваша полезная нагрузка включает ключ noteVotesButWorks
. Связыватель данных создаст экземпляр VoteCommand
, а затем проверит, есть ли свойство noteVotesButWorks
в этом экземпляре, а его нет, поэтому связыватель данных на самом деле не имеет ничего общего. Затем ваш экземпляр VoteCommand
проходит валидацию, которая проходит, потому что ваше единственное ограничение - postList nullable: false
, которое проходит, потому что postList
не является нулевым.
Все работает так, как задумано. Вероятно, вы хотите, чтобы ключ в вашей карте полезной нагрузки совпадал с именем свойства List
в VoteCommand
.
Помимо всего этого, нет веских причин для включения .withLazyDefault { new ListItem() }
в инициализацию вашего свойства. Вам вообще не нужно инициализировать свойство. Связующее устройство данных сделает это за вас.
Это не совсем связано с вашим вопросом, но у вас есть
respond params.errors
. Ты имел ввидуrespond command.errors
?