Grails XML编组:更改默认的“”根元素名称

默认情况下,Grails在XML中使用元素标记在其根目录中呈现List。 同样,它使用

渲染Map。 我想控制根元素的名称。

如果我正在返回User的ArrayList,那么我想看看:

  ... ...  

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

  • 轻松将此序列化应用于50多个域类
  • 从开发人员中抽象出来,因此在渲染域对象期间不需要显式编码(即,当调用render()respond() ,仍会传入ArrayList,没有像as MyNewType那样的显式转换/转换)
  • 能够处理空列表的边缘情况(应该返回

尼斯对富人:

  • 如果这个公式也可以应用于Map,那很棒:)

我已经半成功地实现了上述目标,除了我不知道如何解释空列表案例。 我实现了自己的ObjectMarshaller,它呈现了List类型的所有对象。 只要列表包含一个元素,我就可以检查元素的类型并确定复数标记名称应该是什么(User => users)。 但是如果列表是空的,并且由于Javagenerics是擦除的(除非在Groovy中有所不同?)然后我没有办法正确命名空列表而不是默认为类的东西,这是不可接受的。

我经历过的一些资源:

  • 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 } @Override String getElementName(final Object o) { 'users' } }) } } 

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

对于地图,您可以扩展MapMarshaller

另请参阅http://mrhaki.blogspot.com/2014/02/grails-goodness-customize-root-element.html