当XML请求包含单元素集合时,Grails数据绑定失败

时间:2014-03-04 02:49:39

标签: xml grails data-binding groovy grails-2.0

更新:这可能会成为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有许多嵌套属性,因此尝试创建它的实例需要大量的手动工作。

提前感谢您的帮助。 : - )

2 个答案:

答案 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>