【发布时间】:2014-03-04 02:49:39
【问题描述】:
更新:这可能是一个 Grails 错误。请看:
- http://grails.1312388.n4.nabble.com/Data-binding-fails-when-XML-request-contains-single-element-collection-td4654637.html
- http://jira.grails.org/browse/GRAILS-11175
如果传入的 XML 请求正文包含 1 个元素的集合,我遇到了一个奇怪的问题,即数据绑定失败。对于 2 个或更多元素,一切都很好。
我有以下命令对象:
class MyCommand {
Set<Something> somethings
}
我有以下 POGO(不是域类):
class Something {
String name
}
我正在使用这样的命令:
def save(MyCommand command) {
respond command
}
以下输入一切正常:
<myCommand>
<somethings>
<something>
<name>Something 1</name>
</something>
<something>
<name>Something 2</name>
</something>
</somethings>
</myCommand>
但不适用于此输入:
<myCommand>
<somethings>
<something>
<name>Something 1</name>
</something>
</somethings>
</myCommand>
我看到以下服务器错误(Grails 试图有效地调用“new Set()”):
java.lang.NoSuchMethodException: java.util.Set.<init>()
这是有趣的部分:如果我通过将Something 移动到“域”Grails 目录下将其作为域对象,则不会发生上述错误。这意味着,即使请求正文包含单个元素的 XML 集合,Grails 也会创建一个具有单个元素的 Set,并且不会引发异常。
此外,如果请求正文包含 JSON 而不是 XML,即使不使用域对象也一切正常:请求可以包含单个元素集合,而 Grails 仍然正确地实例化我的命令对象。我认为这是可行的,因为 JSON 明确定义了集合类型。
问题:如何在使用命令对象的同时仍然使用包含单元素 XML 集合的请求?
从技术上讲,我可以使用@BindUsing 为该属性编写自己的绑定,并检查源映射是否为非集合,如果是,则将其设为单元素集合。但这对我不起作用,因为我把问题简单化了,Something 有很多自己的嵌套属性,所以尝试创建它的实例需要大量的手动工作。
提前感谢您的帮助。 :-)
【问题讨论】:
标签: xml grails data-binding groovy grails-2.0