Grails XML封送处理:更改默认的 “”根元素名称

2020年5月3日 46点热度 0条评论

默认情况下,Grails的根目录使用<list>元素标签以XML形式呈现List。同样,它使用<map>渲染Map。我想控制根元素的名称。

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

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


如何实现以上目标?要求如下:

  • 易于将此序列化应用于50多个域类
  • 从开发人员那里摘录的,因此在渲染域对象时不需要显式编码(即,当render()respond()被调用时,仍传递ArrayList,无需像as MyNewType那样进行显式转换/转换)
  • 能够处理空列表的边缘情况(应返回<users/>)
  • 物超所值:

  • 如果此公式也可以应用于Map,那就太好了:)
  • 我不成功地实现了上述目标,除了我不知道如何解决空列表的情况。我实现了自己的ObjectMarshaller,该对象呈现了
    List类型的所有对象。只要列表包含一个元素,我就可以检查元素的类型并确定复数标记名称应为(User => users)。但是,如果列表为空,并且由于Java泛型是通过擦除(除非Groovy有所不同?),那么除了默认为
    <list/>这样的东西(这是 Not Acceptable )之外,我没有办法正确命名一个空列表。

    我经历过的一些资源:

  • http://www.cacoethes.co.uk/blog/groovyandgrails/dry-json-and-xml-with-grails
  • http://grails.1312388.n4.nabble.com/Custom-XML-Marshaller-change-the-root-element-name-td4649949.html
  • http://jwicz.wordpress.com/2011/07/11/grails-custom-xml-marshaller/
  • http://mrhaki.blogspot.com/2013/11/grails-goodness-register-custom.html
  • http://manbuildswebsite.com/2010/02/15/rendering-json-in-grails-part-3-customise-your-json-with-object-marshallers/
  • 解决方案如下:

    实现此目的的一种方法是为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实例。

    对于 map ,您可以扩展MapMarshaller


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