当XML请求包含单个元素集合时,Grails数据绑定失败
更新:这可能是一个Grails bug。请参阅:当XML请求包含单个元素集合时,Grails数据绑定失败,xml,grails,data-binding,groovy,grails-2.0,Xml,Grails,Data Binding,Groovy,Grails 2.0,更新:这可能是一个Grails bug。请参阅: 我遇到了一个奇怪的问题,如果传入的XML请求体包含1个元素的集合,那么数据绑定就会失败。对于2个或更多元素,一切都很好 我有以下命令对象: class MyCommand { Set<Something> somethings } 我使用的命令如下: def save(MyCommand command) { respond command } 对于以下输入,一切正常: <myCo
class MyCommand {
Set<Something> somethings
}
我使用的命令如下:
def save(MyCommand command) {
respond command
}
对于以下输入,一切正常:
<myCommand>
<somethings>
<something>
<name>Something 1</name>
</something>
<something>
<name>Something 2</name>
</something>
</somethings>
</myCommand>
一点
2点
但不适用于此输入:
<myCommand>
<somethings>
<something>
<name>Something 1</name>
</something>
</somethings>
</myCommand>
一点
我看到以下服务器错误(Grails试图有效地调用“new Set()”):
java.lang.NoSuchMethodException:java.util.Set.()
有趣的是:如果我将某物
移动到“domain”Grails目录下,使其成为域对象,则不会发生上述错误。这意味着,即使请求主体包含单个元素的XML集合,Grails也将创建一个包含单个元素的集合,并且不会引发异常
此外,如果请求体包含JSON而不是XML,那么即使不使用域对象,一切都很好:请求可以包含单个元素集合,Grails仍然正确地实例化了我的命令对象。我认为这是可行的,因为JSON显式定义了集合类型
问题:如何使用命令对象并仍然使用包含单元素XML集合的请求
从技术上讲,我可以使用@BindUsing为该属性编写自己的绑定,并检查源映射是否为非集合,如果是,则将其设置为单个元素集合。但这对我来说是行不通的,因为我把问题简化了,而且有些东西本身有许多嵌套的属性,所以尝试创建它的实例需要大量的手工工作
提前感谢您的帮助。:-) 这是一个Grails bug,将在2.3.7中解决:我在我的项目(rails)中遇到了同样的问题。例如,当rails将xml转换为散列时,它会将单个元素集合转换为散列(而不是数组),但如果有多个元素,ROR会将其转换为散列数组(正确)。这是xml集合的问题 我的解决方案是在集合中添加虚拟元素,因此我建议舒尔将一个元素集合(现在是1+虚拟=2个元素集合)转换为数组
<myCommand>
<somethings>
<something>
<name>Something 1</name>
</something>
<something>
<name>dummy</name>
</something>
</somethings>
</myCommand>
一点
笨蛋
有趣的是,ROR也有这个问题。我的另一个解决方法是一个更简单的没有数据的虚拟元素:
。使用这种语法,Grails甚至没有在数组中包含额外的元素(数组是单个元素,这是我想要的)。
java.lang.NoSuchMethodException: java.util.Set.<init>()
<myCommand>
<somethings>
<something>
<name>Something 1</name>
</something>
<something>
<name>dummy</name>
</something>
</somethings>
</myCommand>