O/X Mapper 是什么?

Spring 3.0 的一个新特性是 O/X Mapper。O/X 映射器这个概念并不新鲜,O 代表 Object,X 代表 XML。它的目的是在 Java 对象(几乎总是一个 plain old Java object,或简写为 POJO)和 XML 文档之间来回转换。

例 如,您可能有一个带有几个属性的简单 bean,且您的业务需要将那个 Java 对象转换为一个 XML 文档。Spring 的 O/X Mapper 能够为您解决那个问题。如果反过来,您需要将一个 XML 文档转换为一个简单 Java bean,Spring 的 O/X Mapper 也能胜任。

有一点需要注意:Spring O/X Mapper 只是定义由流行的第三方框架实现的统一的界面。要利用 Spring 的 O/X 功能,您需要一个在 Java 对象和 XML 之间来回转换的实用程序。Castor 就是这样一个流行的第三方工具,本文将使用这个工具。其他这样的工具包括 XMLBeans、Java Architecture for XML Binding (JAXB)、JiBX 和 XStream。

编组和解组

进行 O/X 映射时,您经常会看到编组(marshalling)和解组(unmarshalling) 这两个术语。

编组 指将 Java bean 转换成 XML 文档的过程,这意味着 Java bean 的所有字段和字段值都将作为 XML 元素或属性填充到 XML 文件中。有时,编组也称为序列化(serializing)。

如您所料,解组 是与编组完全相反的过程,即将 XML 文档转换为 Java bean,这意味着 XML 文档的所有元素或属性都作为 Java 字段填充到 Java bean 中。有时,解组也称为反序列化(deserializing)。

使用 Spring 的 O/X Mapper 的好处

使 用 Spring 的 O/X Mapper 的一个最直接的好处是可以通过利用 Spring 框架的其他特性简化配置。Spring 的 bean 库支持将实例化的 O/X 编组器注入(即前面提到过的 “依赖项注入”)使用那些编组器的对象。重申一遍,这将加快应用程序开发和部署。

遵循坚实的面向对象的设计实践,Spring O/X 框架只定义两个接口:Marshaller 和 Unmarshaller,它们用于执行 O/X 功能,这是使用这个框架的另一个重大好处。这些接口的实现完全对独立开发人员开放,开发人员可以轻松切换它们而无需修改代码。例如,如果您一开始使用 Castor 进行 O/X 转换,但后来发现它缺乏您需要的某个功能,这时您可以切换到 XMLBeans 而无需任何代码更改。唯一需要做的就是更改 Spring 配置文件以使用新的 O/X 框架。

使用 Spring 的 O/X Mapper 的另一个好处是统一的异常层次结构。Spring 框架遵循使用它的数据访问模块建立的模式,方法是将原始异常对象包装到 Spring 自身专为 O/X Mapper 建立的运行时异常中。由于第三方提供商抛出的原始异常被包装到 Spring 运行时异常中,您能够查明出现异常的根本原因。您也不必费心修改代码以捕获异常,因为异常已包装到一个运行时异常中。以下几个运行时异常扩展了基础异常 XMLMappingException:GenericMarshallingFailureException、 ValidationFailureException、MarshallingFailureException 和 UnmarshallingFailureException。

入门栗子

配置清单:

applicationContext.xml Spring配置文件

<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-3.0.xsd"><bean id="oxmDemo" class="com.mdf.springoxm.oxmDemo"><property name="marshaller" ref="castorMarshaller" /><property name="unmarshaller" ref="castorMarshaller" /></bean><!-- 引入castor包:castor-1.3.2-core.jar,castor-1.3.2-xml.jar --><bean id="castorMarshaller" class="org.springframework.oxm.castor.CastorMarshaller"><property name="mappingLocation" value="classpath:mapping.xml" /></bean>
</beans>

编组和解组时,套用的mapping格式,在进行解组的时候, 必须使用mapping才能成功(这里存在疑问,不知道是否因为自己写法问题,只能通过mapping进行格式编码才能进行解组,否则报出无法找到root element的错误)。
mapping.xml文件

<mapping><class name="com.mdf.springoxm.Customer"><map-to xml="Customer"/><field name="flag" type="boolean"><bind-xml name="flag" node="element"/></field><field name="name" type="string"><bind-xml name="name" node="element"/></field><field name="sex" type="string"><bind-xml name="sex" node="element"/></field></class>
</mapping>

自定义Bean文件

Customer.java

package com.mdf.springoxm;public class Customer {private String name;private String sex;private Boolean flag;public String getName() {return name;}public void setName(String name) {this.name = name;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}public Boolean getFlag() {return flag;}public void setFlag(Boolean flag) {this.flag = flag;}
}

xmlDemo.java文件

package com.mdf.springoxm;import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;
import org.springframework.oxm.Marshaller;
import org.springframework.oxm.Unmarshaller;public class oxmDemo{private Marshaller marshaller;private Unmarshaller unmarshaller;public Marshaller getMarshaller() {return marshaller;}public void setMarshaller(Marshaller marshaller) {this.marshaller = marshaller;}public Unmarshaller getUnmarshaller() {return unmarshaller;}public void setUnmarshaller(Unmarshaller unmarshaller) {this.unmarshaller = unmarshaller;}public void convertFromObjectToXML(Object object, String filepath)throws IOException {FileOutputStream os = null;try {os = new FileOutputStream(filepath);getMarshaller().marshal(object, new StreamResult(os));} finally {if (os != null) {os.close();}}}public Object convertFromXMLToObject(String xmlfile) throws IOException {FileInputStream is = null;try {is = new FileInputStream(xmlfile);return getUnmarshaller().unmarshal(new StreamSource(is));} finally {if (is != null) {is.close();}}}}

测试

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;import com.mdf.springoxm.Customer;
import com.mdf.springoxm.oxmDemo;
import java.io.IOException;public class Main {private static final String XML_FILE_NAME = "customer.xml";public static void main(String[] args) throws IOException {ApplicationContext appContext = new ClassPathXmlApplicationContext("applicationContext.xml");oxmDemo converter = (oxmDemo) appContext.getBean("oxmDemo");Customer customer = new Customer();customer.setName("yiibai");customer.setFlag(true);customer.setSex("Haikou haidiandao");System.out.println("Convert Object to XML!");//from object to XML fileconverter.convertFromObjectToXML(customer, XML_FILE_NAME);System.out.println("Done \n");System.out.println("Convert XML back to Object!");//from XML to objectCustomer customer2 = (Customer)converter.convertFromXMLToObject(XML_FILE_NAME);System.out.println(customer2);System.out.println("Done");}
}

测试结果:

五月 11, 2016 2:27:52 下午 org.springframework.context.support.ClassPathXmlApplicationContext prepareRefresh
信息: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@1221be2: startup date [Wed May 11 14:27:51 CST 2016]; root of context hierarchy
五月 11, 2016 2:27:52 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
信息: Loading XML bean definitions from class path resource [applicationContext.xml]
五月 11, 2016 2:27:52 下午 org.springframework.oxm.castor.CastorMarshaller afterPropertiesSet
信息: Configured using [class path resource [mapping.xml]]
Convert Object to XML!
Done Convert XML back to Object!
com.mdf.springoxm.Customer@b419da
Done

【Spring】Spring oxm 入门初尝试相关推荐

  1. Spring oxm入门实例

    O/XMapper是什么? Spring3.0的一个新特性是O/XMapper.O/X映射器这个概念并不新鲜,O代表Object,X代表XML.它的目的是在Java对象(几乎总是一个plainoldJ ...

  2. spring social_Spring Social入门–第2部分

    spring social 几周前,我写了一篇文章,展示了我认为可以使用Spring Social编写的最简单的应用程序. 该应用程序读取并显示了Twitter用户的公共数据,并被编写为Spring ...

  3. Spring Data Solr入门

    Spring Data Solr是Spring Data项目的扩展,该项目旨在简化Apache Solr在Spring应用程序中的使用. 请注意,这不是Spring(数据)或Solr的简介. 我认为您 ...

  4. Spring Boot(4)---入门:安装Spring Boot

    Spring Boot入门:安装Spring Boot TagsSpring Boot, Spring Boot中文官方文档 安装Spring Boot Spring Boot可以与"经典& ...

  5. Spring Boot从入门到精通(超详细)

    Spring Boot从入门到精通(超详细) _kayden_ 2020-07-20 15:19:22 9491 正在上传-重新上传取消​ 收藏 184 分类专栏: springboot 文章标签:  ...

  6. Spring Cloud Eureka 入门 (三)服务消费者详解

    2019独角兽企业重金招聘Python工程师标准>>> 摘要: 原创出处:www.bysocket.com 泥瓦匠BYSocket 希望转载,保留摘要,谢谢! "真正的进步 ...

  7. Spring Data ElasticSearch入门案例

    Spring Data ElasticSearch入门案例 创建maven工程elasticsearch_springdata 基于maven导入坐标 导入spring data elasticsea ...

  8. 微服务技术方案:Spring Cloud 从入门到实战

    随着互联网技术的发展与不断创新,以及用户流量的不断增大,越来越多的企业项目面临大数据.高并发等问题,随之而来的就是通过分布式模型组建架构,微服务思想就集中体现了应用价值,2020 年的你还没有掌握微服 ...

  9. spring boot(一)入门

    目录 spring boot(一)入门 一.简介 1.微服务的概念 2.什么是spring boot 3.快速入门 4.springboot的快捷部署 spring boot(一)入门 一.简介 1. ...

最新文章

  1. 56岁潘石屹下定决心学Python,60多岁程序语言之父们还在敲代码,你还敢懈怠吗?...
  2. 现代操作系统: 第五章 输入/输出
  3. (转)DevExpress 汉化(简单、实用、快速)
  4. drupal 覆写登录框
  5. verilog秒表计时器
  6. C# 实体类几种深拷贝的方法——解决关于对象赋值,A=B,A改变,B也改变问题
  7. 转自: http://blog.csdn.net/xiaxiaorui2003/article/details/3838631
  8. 7001.ubuntu18.04搭建go语言开发环境
  9. c语言牛顿方法,C语言编写牛顿迭代法的跟踪
  10. Eclipse SVN修改用户名和密码
  11. go 遍历二维数组json_for-range造就循环永动机?快来看看go中for-range的那些事!
  12. Atitit q2016 q5 doc list on home ntpc.docx
  13. java将录音转换成文字,除了把录音转换成文字,原来录音转文字助手还有这么多实用功能...
  14. matlab 色彩的范围,Matlab - 将2个颜色条设置为带有色彩图和良好范围的2个图例...
  15. Mysql日志与备份以及恢复
  16. 大数据工程师的日常工作内容是干嘛?
  17. 微信小程序使用百度api获取天气信息 —— 微信小程序教程系列(16)
  18. SAP ABAP(增强技术) BADI自己的一些了解,以及用法
  19. python中的flatten_numpy下的flatten()函数用法详解
  20. DDD(领域驱动设计)系列主题:领域和子域

热门文章

  1. 你还在焦虑?还在痛苦吗?几句肺腑之言帮你大彻大悟
  2. xorm oracle,更新日志 · XORM操作指南 · 看云
  3. 【JZ14 剪绳子】
  4. opencv 滤波 方框滤波 均值滤波 高斯滤波 中值滤波 双边滤波
  5. 服务器上可以跑,本地Pycharm中报错Ninja is required to load C++ extensions
  6. TCP建立连接和断开连接图解
  7. 软件测试生命周期——需求分析、测试计划、测试用例设计、测试执行和测试评估
  8. Java语言对字节数组截取指定长度
  9. 模拟JAVA堆内存溢出和栈内存溢出
  10. 【ROS】ROS1编程速览