我在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
打印到stdout。
拜托,有人可以给我一些指示吗?
答案 0 :(得分:1)
拜托,有人可以给我一些指示吗?
您的有效负载包含密钥noteVotesButWorks
。数据绑定器将创建VoteCommand
的实例,然后查看该实例上是否存在noteVotesButWorks
属性,但没有,因此数据绑定器实际上没有任何内容去做。然后验证您的VoteCommand
实例,因为您的唯一约束是postList nullable: false
,因为postList
不为空,所以它会通过。
一切都按设计工作。您可能希望有效负载映射中的密钥与List
中VoteCommand
属性的名称相匹配。
除此之外,没有充分的理由在您的属性初始化中包含.withLazyDefault { new ListItem() }
。您根本不需要初始化该属性。数据绑定器将为您完成。
答案 1 :(得分:0)
我认为你不希望nullable: false
用于postList。空列表不为空。我想你想要minSize: 1
。