java - Grails XML 编码 : change default "<list>" root element name

标签 java xml grails serialization marshalling

默认情况下,Grails 使用 <list> 呈现 XML 中的列表。元素标签位于其根部。同样,它使用 <map> 渲染 Map 。我想控制根元素的名称。

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

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

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

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

必备品:

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

我已经半成功地实现了上述目标,但我不知道如何解释空列表的情况。我实现了自己的 ObjectMarshaller,它渲染 List 类型的所有对象。只要列表包含一个元素,我就可以检查该元素的类型并确定复数标记名称应该是什么(User => users)。但是,如果列表为空,并且由于 Java 泛型是删除的(除非 Groovy 中不同?),那么除了默认为 <list/> 之类的值之外,我无法正确命名空列表。 ,这是 Not Acceptable 。

我使用过的一些资源:

最佳答案

实现此目的的一种方法是为 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 中也有描述

关于java - Grails XML 编码 : change default "<list>" root element name,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21592731/

相关文章:

java - 线程完成后触发 System.exit()

c# - 如何在xml中写入CData

java - xml 字符串到文件

grails - 如何通过 Grails 中的 Config.groovy 条目定义自定义表映射

grails - 在基本OS上编译/运行Grails应用3.2.5时出现错误

java - Spring Boot 支持 servlet 2.5 自动配置吗?

java - 我可以让 indexOf 以不同的方式比较对象吗?

java - Firebase 数据库不向我显示图片

java - Android NavigationView 抽屉没有关闭

grails - 在Grails 2中以编程方式配置log4j以在运行时记录到自定义文件