Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当XML请求包含单个元素集合时,Grails数据绑定失败_Xml_Grails_Data Binding_Groovy_Grails 2.0 - Fatal编程技术网

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

当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

更新:这可能是一个Grails bug。请参阅:

我遇到了一个奇怪的问题,如果传入的XML请求体包含1个元素的集合,那么数据绑定就会失败。对于2个或更多元素,一切都很好

我有以下命令对象:

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>