0

我在 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 请求后,我得到一个201grails.validation.ValidationErrors: 0 errors打印到标准输出。

拜托,这里有人可以给我一些指示吗?

4

2 回答 2

1

拜托,这里有人可以给我一些指示吗?

您的有效负载包括密钥noteVotesButWorks。数据绑定器将创建一个实例,VoteCommand然后查看该实例上是否有noteVotesButWorks属性,但没有,因此数据绑定器实际上没有任何事情要做。然后验证您的VoteCommand实例,该实例通过,因为您唯一的约束是postList nullable: false,它通过,因为postList不为空。

这一切都按设计工作。您可能希望有效负载映射中的键ListVoteCommand.

与所有这些不同,没有充分的理由将其包含.withLazyDefault { new ListItem() }在您的属性初始化中。您根本不需要初始化该属性。数据绑定器将为您完成此操作。

于 2018-04-11T15:36:18.183 回答
0

我认为您不需要nullable: falsepostList。空列表不为空。我想你想要minSize: 1

于 2018-04-11T15:03:25.063 回答