Grails XML处理相关问题:控制器返回XML与XML转对象实现
问题1:Grails控制器正确返回XML格式响应的实现
你当前使用render xmlOut的实现是符合基本规范的,不过如果要更严谨、更贴合Grails的约定开发,推荐两种优化方案:
方案1:继续使用render方法,显式声明响应元数据
直接渲染XML字符串时,显式指定contentType和编码,避免部分场景下响应头默认返回text/plain的问题:
render text: xmlOut, contentType: "application/xml", encoding: "UTF-8"
方案2:使用respond方法,省去手动序列化逻辑
你之前用respond返回异常的原因是:respond会自动对传入对象做序列化转换,传入String类型时会被当做普通文本外层嵌套XML节点,不会直接输出原始XML。你可以直接把解析好的Node对象传给respond,Grails会自动完成XML序列化:
class TestController { static responseFormats = ['xml'] def index() { String xml = "<a><b>abcd</b><b>defg</b></a>" Node parsed = new XmlParser().parseText(xml) // 直接传入Node对象即可,不需要手动转字符串 respond parsed, formats: ['xml'] } }
问题2:XML字符串映射为指定类实例的实现
Grails生态有两种常用的实现方式,分别对应原生能力和第三方工具:
方案1:Grails原生XmlSlurper+数据绑定
适合简单场景,不需要引入额外依赖:
// 先定义对应结构的领域类/POGO class B { String content } class A { List<B> b = [] } // 解析绑定逻辑 String xml = "<a><b>abcd</b><b>defg</b></a>" def rootNode = new XmlSlurper().parseText(xml) A a = new A() rootNode.b.each { node -> a.b.add(new B(content: node.text())) }
方案2:Jackson XML模块实现全自动映射
如果需要和示例一致的极简调用,可引入Jackson XML数据绑定模块:
- 首先在
build.gradle中添加依赖:
implementation 'com.fasterxml.jackson.dataformat:jackson-dataformat-xml'
- 直接调用实现自动映射:
import com.fasterxml.jackson.dataformat.xml.XmlMapper String xml = "<a><b>abcd</b><b>defg</b></a>" XmlMapper xmlMapper = new XmlMapper() // 一行代码完成XML到指定类实例的转换 A a = xmlMapper.readValue(xml, A.class)
使用该方案需要保证类字段名和XML节点名完全匹配,嵌套结构会自动完成映射。
内容的提问来源于stack exchange,提问作者MS123456789
相关产品推荐
相关产品推荐

