【问题标题】:Grails data binding fails when XML request contains single-element collection当 XML 请求包含单元素集合时,Grails 数据绑定失败
【发布时间】:2014-03-04 02:49:39
【问题描述】:

更新:这可能是一个 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>() 

这是有趣的部分:如果我通过将Something 移动到“域”Grails 目录下将其作为域对象,则不会发生上述错误。这意味着,即使请求正文包含单个元素的 XML 集合,Grails 也会创建一个具有单个元素的 Set,并且不会引发异常。

此外,如果请求正文包含 JSON 而不是 XML,即使不使用域对象也一切正常:请求可以包含单个元素集合,而 Grails 仍然正确地实例化我的命令对象。我认为这是可行的,因为 JSON 明确定义了集合类型。

问题:如何在使用命令对象的同时仍然使用包含单元素 XML 集合的请求?

从技术上讲,我可以使用@BindUsing 为该属性编写自己的绑定,并检查源映射是否为非集合,如果是,则将其设为单元素集合。但这对我不起作用,因为我把问题简单化了,Something 有很多自己的嵌套属性,所以尝试创建它的实例需要大量的手动工作。

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

【问题讨论】:

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


    【解决方案1】:

    这原来是一个 Grails 错误,将在 2.3.7 中解决:http://jira.grails.org/browse/GRAILS-11175

    【讨论】:

      【解决方案2】:

      我的项目(在 Rails 上)也遇到了同样的问题。例如,当 rails 将 xml 转换为哈希时,它会将单元素集合转换为哈希(不是数组),但如果有超过 1 个元素,ROR 会将其转换为哈希数组(正确)。这是xml集合的问题。

      我的解决方案是向集合中添加一个虚拟元素,因此我确信将单元素集合(现在是 1+dummy = 2 元素集合)转换为数组。

      <myCommand>
              <somethings>
                      <something>
                              <name>Something 1</name>
                      </something>
                      <something>
                              <name>dummy</name>
                      </something>
              </somethings>
      </myCommand> 
      

      【讨论】:

      • 有趣的是,ROR 也有这个问题。我的另一个解决方法是一个更简单的没有数据的虚拟元素:&lt;something /&gt;。使用这种语法 Grails 甚至没有在数组中包含额外的元素(数组是单个元素,这是我想要的)。
      猜你喜欢
      • 2017-02-18
      • 1970-01-01
      • 2017-05-14
      • 1970-01-01
      • 2017-07-16
      • 1970-01-01
      • 2012-11-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多