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 请求后,我会在标准输出中打印出 201
和 grails.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如何在由数据模板中的对象列表组成的列表框中设置项目[重复]