当前位置: 首页 > news >正文

Spring OXM:轻松实现Java-XML互转

以下内容是来自 Spring Framework 官方文档 的一个章节,标题为:

5. Marshalling XML by Using Object-XML Mappers(使用对象-XML 映射器进行 XML 编组)

这个章节系统地介绍了 Spring 框架中如何通过 O-X Mapping(Object-XML Mapping,对象与 XML 的映射) 技术来实现 Java 对象和 XML 数据之间的相互转换。这种技术在现代开发中虽然不如 JSON 流行,但在一些遗留系统、Web 服务(如 SOAP)、配置文件处理等场景中仍然非常重要。


🌟 整体理解:这是讲什么的?

简单来说,这一章讲的是:

如何用 Spring 框架把 Java 对象变成 XML(序列化/编组),以及把 XML 变回 Java 对象(反序列化/解组)。

这类似于我们熟悉的 JacksonGson 处理 JSON,只不过这里是处理 XML


🔍 分节详解

5.1 Introduction(简介)

核心概念:
  • Marshalling(编组 / 序列化):将 Java 对象 → 转成 XML。
  • Unmarshalling(解组 / 反序列化):将 XML → 转成 Java 对象。
  • 这两个操作合起来叫 O-X Mapping(对象-XML 映射)
Spring 做了哪些事?
  1. 简化配置
    不用手动 new JAXBContext、JiBX BindingFactory 等底层对象,直接像普通 Bean 一样注入即可。
  2. 统一接口
    所有 O-X 工具都实现了 MarshallerUnmarshaller 接口,可以轻松切换不同技术(比如从 JAXB 换到 XStream)。
  3. 统一异常体系
    所有底层异常都被包装成 Spring 的运行时异常 XmlMappingException,避免检查异常污染代码。

5.2 Marshaller 和 Unmarshaller 接口

这两个是 Spring 提供的核心接口。

5.2.1 Marshaller 接口
void marshal(Object graph, Result result) throws XmlMappingException, IOException;

作用:把一个 Java 对象写入到 XML 输出目标(Result)。

Result 实现类包装的输出形式
DOMResultW3C DOM Node(内存中的 XML 树)
SAXResultSAX ContentHandler(事件驱动)
StreamResult文件、OutputStream、Writer

⚠️ 注意:不是所有类都能随便传进去!必须被“映射”过(加注解、注册类、或有 schema 支持)。

5.2.2 Unmarshaller 接口
Object unmarshal(Source source) throws XmlMappingException, IOException;

作用:从 XML 输入源读取并还原成 Java 对象。

Source 实现类包装的输入形式
DOMSourceDOM Node
SAXSourceInputSource + XMLReader
StreamSourceFile、InputStream、Reader

💡 大多数实现类同时实现了 MarshallerUnmarshaller,所以一个 bean 可以既用于序列化又用于反序列化。

5.2.3 XmlMappingException

Spring 将各种 O-X 工具(JAXB、XStream 等)抛出的原始异常统一转换为自己的异常树,根节点就是 XmlMappingException

这样你在业务代码里只需要捕获一种异常类型,不用关心底层用了哪种工具。

子类还有:

  • MarshallingFailureException
  • UnmarshallingFailureException

便于区分错误发生在哪个阶段。


5.3 使用示例:保存/加载设置

这是一个完整的例子,展示如何用 Spring OXM 来持久化应用设置。

示例结构:
class Settings {private boolean fooEnabled;// getter/setter
}
class Application {private Settings settings = new Settings();private Marshaller marshaller;private Unmarshaller unmarshaller;public void saveSettings() throws IOException {try (FileOutputStream os = new FileOutputStream("settings.xml")) {marshaller.marshal(settings, new StreamResult(os));}}public void loadSettings() throws IOException {try (FileInputStream is = new FileInputStream("settings.xml")) {settings = (Settings) unmarshaller.unmarshal(new StreamSource(is));}}
}
配置文件 applicationContext.xml:
<bean id="application" class="Application"><property name="marshaller" ref="xstreamMarshaller"/><property name="unmarshaller" ref="xstreamMarshaller"/>
</bean><bean id="xstreamMarshaller" class="org.springframework.oxm.xstream.XStreamMarshaller"/>
输出结果:
<?xml version="1.0" encoding="UTF-8"?>
<settings foo-enabled="false"/>

✅ 特点:无需任何额外配置(XStream 默认支持 POJO),非常方便快速上手。


5.4 XML 配置命名空间(oxm namespace)

为了更简洁地配置 marshaller,Spring 提供了 <oxm:xxx> 标签。

需要先引入命名空间:

<beans xmlns:oxm="http://www.springframework.org/schema/oxm"xsi:schemaLocation="http://www.springframework.org/schema/oxm https://www.springframework.org/schema/oxm/spring-oxm.xsd">

然后可以用简写方式创建 marshaller:

JAXB 示例:
<oxm:jaxb2-marshaller id="marshaller" contextPath="org.example.schema"/>

等价于:

<bean class="Jaxb2Marshaller"><property name="contextPath" value="..."/>
</bean>

5.5 JAXB(Java Architecture for XML Binding)

JAXB 是标准的 Java XML 绑定方案,支持通过注解或 XSD 自动生成类。

Jaxb2Marshaller
  • 实现了 MarshallerUnmarshaller
  • 必须指定 contextPath(包名列表)或 classesToBeBound
配置方式一:通过 contextPath
<bean class="Jaxb2Marshaller"><property name="contextPath" value="com.example.model"/>
</bean>
配置方式二:显式列出类
<bean class="Jaxb2Marshaller"><property name="classesToBeBound"><list><value>com.example.Flight</value><value>com.example.Flights</value></list></property>
</bean>

还可以加上 XSD 校验:

<property name="schema" value="classpath:schema.xsd"/>

✅ 优点:标准、稳定、适合 Web Services(SOAP)
❌ 缺点:配置略复杂,性能一般


5.6 JiBX

JiBX 是一种基于字节码增强的技术,类似 Hibernate 对数据库的操作。

  • 先定义 binding.xml 描述映射规则
  • 编译后用 JiBX 工具“增强”class 文件,插入序列化逻辑
  • 性能高、生成的 XML 干净
JibxMarshaller

每个实例只能处理一个类(由 targetClass 指定)

<bean class="JibxMarshaller"><property name="targetClass" value="org.example.Flights"/>
</bean>

如果要处理多个类,就得配多个 JibxMarshaller

✅ 优点:速度快、控制精细
❌ 缺点:需额外构建步骤(字节码增强),学习成本较高


5.7 XStream

XStream 是最简单的 XML 序列化库之一,不需要注解也不需要 mapping 文件。

XStreamMarshaller

开箱即用,配置极少:

<bean id="xstream" class="XStreamMarshaller"/>

可选配置别名(让 XML 更友好):

<property name="aliases"><props><prop key="Flight">org.example.Flight</prop></props>
</property>

⚠️ 重要安全警告:

XStream 默认允许反序列化任意类,容易导致 远程代码执行漏洞(RCE)

✅ 正确做法:限制只允许特定类反序列化:

<property name="supportedClasses" value="org.example.Flight"/>

或者注册自定义 converter,禁用默认行为。

✅ 优点:简单、易用、POJO 友好
❌ 缺点:安全性差(外部输入慎用)、不支持命名空间(不适合 Web Service)


✅ 总结对比表

技术是否需要注解/mapping性能安全性适用场景
JAXB是(或 XSD)中等Web Services、企业级系统
JiBX是(binding.xml)高性能 XML 处理
XStream否(自动探测)低(默认)内部配置文件、测试

🧠 如何选择?

场景推荐方案
使用 SOAP Web Service✅ JAXB(标准兼容)
内部配置文件读写✅ XStream(简单快捷)
高频 XML 处理(大批量)✅ JiBX(高性能)
外部不可信 XML 输入❌ 避免 XStream;✅ 用 JAXB + Schema 校验

🛡️ 安全提醒(特别重要!)

⚠️ 永远不要对来自外部用户或网络的 XML 使用 XStream 进行 unmarshal!
除非你明确设置了 supportedClasses 或自定义了安全的 Converter。

否则攻击者可以通过构造恶意 XML 触发 RCE(远程代码执行),造成严重安全风险。

参考:XStream Security


📚 学习建议

  1. 如果你是初学者 → 先试 XStream,体验 OXM 的基本流程。
  2. 如果做企业项目或 Web Service → 学 JAXB
  3. 如果追求极致性能 → 看 JiBX
  4. 所有情况下 → 理解 MarshallerUnmarshaller 接口的设计思想。

如果你希望我帮你:

  • 写一个完整的 Maven 示例?
  • 演示如何用 JAXB 注解标注类?
  • 把上面的例子改成 Java Config(非 XML)?
  • 解释某个具体类的作用?

欢迎继续提问 😊

http://www.dtcms.com/a/540277.html

相关文章:

  • 功能测试总结
  • 小白来学习 LVDS 差分原理及应用
  • 【Linux】网络层协议IP
  • 《Muduo网络库:TcpConnection类》
  • 网站详情页怎么做的好看的网页设计作品欣赏
  • 线扫相机上位机开发——如何提高问题排查效率
  • 计算机网络自顶向下方法10——应用层 HTTP/2 成帧 响应报文优先次序和服务器推
  • 孝感网站的建设网页设计一般一个月工资多少
  • 什么是持续集成(CI)和持续交付(CD)?测试在其中扮演什么角色?
  • 利用机器学习优化CPU调度的一些思路案例
  • Kafka 消息顺序消费深度解析:原理、实现方案与全局有序可行性分析
  • 数据结构初识,与算法复杂度
  • 网站色彩搭配中国纪检监察报社官网
  • (六)策略梯度算法 and Actor-Critic 框架
  • 基于萤火虫算法(FA)优化支持向量机(SVM)参数的分类实现
  • 【C++】C++11出来之后,到目前为止官方都做了些什么更新?
  • 公司网站建设及推广淮南网云小镇怎么样
  • UE C++ 离线安装 经验
  • Smart SVG Viewer,一款免费的SVG 图像查看器
  • 基於 MAC 的模型算力估算方法
  • VoxCPM macOS 安装部署
  • 【Linux篇】ELF文件与程序加载:理解链接过程中的静态库,动态库及目标文件
  • 做体育直播网站做数据权威的网站
  • 《因为独特》不畏惧与众不同 王宁泡泡玛特的独特之道:低风险创业的人性解码与产品设计指南
  • 【打靶日记】VulNyx 之 Lower3
  • DomainNet 数据集下载
  • 6.1.2.1 大数据方法论与实践指南-离线任务分类
  • wordpress密码忘了怎么找回郑州网站优化网络建设有限公司
  • AI隐式标识‌中的红绿名单水印技术通俗讲解
  • idea能怎么对比2个文件