【问题标题】:Grails XML marshalling: change default "<list>" root element nameGrails XML 编组:更改默认的“<list>”根元素名称
【发布时间】:2014-02-06 02:15:24
【问题描述】:

默认情况下,Grails 以 XML 格式呈现 List,其根部带有 &lt;list&gt; 元素标签。同样,它使用&lt;map&gt; 渲染地图。我想控制根元素的名称。

如果我要返回用户的 ArrayList,那么我想看看:

<users>
    <user>...</user>
    <user>...</user>
</users>

我怎样才能实现上述目标?以下是要求:

  • 很容易将此序列化应用于 50 多个域类
  • 从开发人员那里提取,因此在渲染域对象期间不需要显式编码(即,当调用 render()respond() 时,仍然传入一个 ArrayList,没有像 as MyNewType 这样的显式转换/转换)
  • 能够处理空列表的边缘情况(应该返回&lt;users/&gt;

锦上添花:

  • 如果这个公式也可以应用于地图,那就太好了:)

我在实现上述目标方面取得了半成功,但我不知道如何解释空列表的情况。我实现了我自己的 ObjectMarshaller,它呈现所有类型为List 的对象。只要列表包含一个元素,我就可以检查元素的类型并确定复数标记名称应该是什么(用户 => 用户)。但是如果列表是空的,并且由于 Java 泛型是通过擦除(除非在 Groovy 中有所不同?),那么除了默认为 &lt;list/&gt; 之类的东西之外,我无法正确命名一个空列表,这是不可接受的。

我经历过的一些资源:

【问题讨论】:

    标签: java xml grails serialization marshalling


    【解决方案1】:

    实现这一点的一种方法是为 CollectionMarshaller 类编写一个子类并将其注册到我们的 Grails 应用程序中。例如,我们可以使用以下代码在 BootStrap.groovy 中注册一个自定义实现:

    import org.codehaus.groovy.grails.web.converters.marshaller.xml.CollectionMarshaller
    import grails.converters.XML
    
    class BootStrap {
    
      def init = { servletContext ->
        // Register custom collection marshaller for List with User instances.
        // The root element name is set to users.
        XML.registerObjectMarshaller(new CollectionMarshaller() {
            @Override
            public boolean supports(Object object) {
                object instanceof List<User>
            }
    
            @Override
            String getElementName(final Object o) {
                'users'
            }
        })
      }
    }
    

    为了使这项工作适用于更多域类,我们可能会在 BootStrap.groovy 中获取对所有域类的引用,并遍历它们以配置自定义 CollectionMarshaller 实例。

    对于地图,您可以扩展 MapMarshaller

    http://mrhaki.blogspot.com/2014/02/grails-goodness-customize-root-element.html中也有描述

    【讨论】:

    • 感谢您的回复。您的示例基本上就是我昨天所做的(我提到的“半成功”解决方案)。这个解决方案的问题是 Groovy 泛型是通过擦除来实现的,就像 Java 一样,所以你的 object instanceof List&lt;User&gt; 将返回 true 用于任何类型的列表,甚至是 List&lt;String&gt;。我将更新我的问题以列出“要求”列表,以便清楚我需要什么。不过再次感谢。
    猜你喜欢
    • 1970-01-01
    • 2017-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-08
    • 2020-11-06
    • 1970-01-01
    相关资源
    最近更新 更多