Grails:如何使用命令对象验证由项目列表组成的 POST 正文?

Posted

技术标签:

【中文标题】Grails:如何使用命令对象验证由项目列表组成的 POST 正文?【英文标题】:Grails: How do a validate POST body consisting of a list of items using a command object? 【发布时间】:2018-09-21 06:02:17 【问题描述】:

我在 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

请问有人可以指点一下吗?

【问题讨论】:

这与您的问题无关,但您有respond params.errors。你打算respond command.errors吗? 还有一个 withFormat 块,其中只有 1 个 case,它是 '*' 通配符,所以 withFormat 不会给你买任何东西。您可以简单地将 else 块的主体设置为 render status: CREATED 而没有 withFormat 装置,并且仍然具有完全相同的行为。 【参考方案1】:

请问有人可以指点一下吗?

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

一切都按设计进行。您可能希望有效负载映射中的键与VoteCommand 中的List 属性的名称相匹配。

除此之外,没有充分的理由将.withLazyDefault new ListItem() 包含在您的属性初始化中。您根本不需要初始化该属性。数据绑定器将为您完成这项工作。

【讨论】:

【参考方案2】:

我认为您不希望 nullable: false 用于 postList。空列表不为空。我想你想要minSize: 1

【讨论】:

这有点用,但不能验证个人 ListItems 只是验证 votes 列表的大小 哦,我没有意识到那些也失败了。再看这个。保存时,如果打印 command*.postList 会得到什么?我很好奇您的有效负载是否甚至被转换为 ListItems。

以上是关于Grails:如何使用命令对象验证由项目列表组成的 POST 正文?的主要内容,如果未能解决你的问题,请参考以下文章

C#WPF如何在由数据模板中的对象列表组成的列表框中设置项目[重复]

Grails 命令对象自定义验证消息代码

grails验证嵌套命令对象不起作用

带有对象列表的 Grails 自定义验证

Grails:如何从控制器逻辑返回错误消息(即不是源自域属性验证)?

如何使用 grails 命令行编译 grails 项目?