更新:这可能会成为Grails的错误。请参阅:
如果传入的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>()
以下是有趣的部分:如果我通过在“域”Grails目录下移动它来使Something
成为域对象,则不会发生上述错误。这意味着,即使请求主体包含单个元素XML集合,Grails也会创建一个包含单个元素的Set,并且不会抛出任何异常。
此外,如果请求正文包含JSON而不是XML,那么即使不使用域对象,一切都很好:请求可以包含单个元素集合,Grails仍然可以正确地实例化我的命令对象。我认为这是有效的,因为JSON明确定义了集合类型。
问题:如何使用命令对象并仍然使用包含单元素XML集合的请求?
从技术上讲,我可以使用@BindUsing为此属性编写自己的绑定,并检查源映射是否为非集合,如果是,则将其设置为单元素集合。但是这对我来说不起作用,因为我已经过度简化了问题,并且Something有许多嵌套属性,因此尝试创建它的实例需要大量的手动工作。
提前感谢您的帮助。 : - )
答案 0 :(得分:0)
这被证明是Grails错误,将在2.3.7:http://jira.grails.org/browse/GRAILS-11175
中解决答案 1 :(得分:0)
我的项目中遇到了同样的问题(在轨道上)。例如,当rails将xml转换为hash时,它会将单元素集合转换为hash(而不是数组),但如果有多个元素,则ROR将其转换为哈希数组(正确)。它是xml集合的问题。
我的解决方案是在集合中添加一个虚拟元素,所以我很清楚单元素集合(现在是1 + dummy = 2个元素集合)被转换为数组。
<myCommand>
<somethings>
<something>
<name>Something 1</name>
</something>
<something>
<name>dummy</name>
</something>
</somethings>
</myCommand>