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配置文件

  1. <beans xmlns="http://www.springframework.org/schema/beans"
  2. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://www.springframework.org/schema/beans
  4. http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
  5. <bean id="oxmDemo" class="com.mdf.springoxm.oxmDemo">
  6. <property name="marshaller" ref="castorMarshaller" />
  7. <property name="unmarshaller" ref="castorMarshaller" />
  8. </bean>
  9. <!-- 引入castor包:castor-1.3.2-core.jar,castor-1.3.2-xml.jar -->
  10. <bean id="castorMarshaller" class="org.springframework.oxm.castor.CastorMarshaller">
  11. <property name="mappingLocation" value="classpath:mapping.xml" />
  12. </bean>
  13. </beans>

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

  1. <mapping>
  2. <class name="com.mdf.springoxm.Customer">
  3. <map-to xml="Customer"/>
  4. <field name="flag" type="boolean">
  5. <bind-xml name="flag" node="element"/>
  6. </field>
  7. <field name="name" type="string">
  8. <bind-xml name="name" node="element"/>
  9. </field>
  10. <field name="sex" type="string">
  11. <bind-xml name="sex" node="element"/>
  12. </field>
  13. </class>
  14. </mapping>

自定义Bean文件

Customer.java

  1. package com.mdf.springoxm;
  2. public class Customer {
  3. private String name;
  4. private String sex;
  5. private Boolean flag;
  6. public String getName() {
  7. return name;
  8. }
  9. public void setName(String name) {
  10. this.name = name;
  11. }
  12. public String getSex() {
  13. return sex;
  14. }
  15. public void setSex(String sex) {
  16. this.sex = sex;
  17. }
  18. public Boolean getFlag() {
  19. return flag;
  20. }
  21. public void setFlag(Boolean flag) {
  22. this.flag = flag;
  23. }
  24. }

xmlDemo.java文件

  1. package com.mdf.springoxm;
  2. import java.io.FileInputStream;
  3. import java.io.FileOutputStream;
  4. import java.io.IOException;
  5. import javax.xml.transform.stream.StreamResult;
  6. import javax.xml.transform.stream.StreamSource;
  7. import org.springframework.oxm.Marshaller;
  8. import org.springframework.oxm.Unmarshaller;
  9. public class oxmDemo{
  10. private Marshaller marshaller;
  11. private Unmarshaller unmarshaller;
  12. public Marshaller getMarshaller() {
  13. return marshaller;
  14. }
  15. public void setMarshaller(Marshaller marshaller) {
  16. this.marshaller = marshaller;
  17. }
  18. public Unmarshaller getUnmarshaller() {
  19. return unmarshaller;
  20. }
  21. public void setUnmarshaller(Unmarshaller unmarshaller) {
  22. this.unmarshaller = unmarshaller;
  23. }
  24. public void convertFromObjectToXML(Object object, String filepath)
  25. throws IOException {
  26. FileOutputStream os = null;
  27. try {
  28. os = new FileOutputStream(filepath);
  29. getMarshaller().marshal(object, new StreamResult(os));
  30. } finally {
  31. if (os != null) {
  32. os.close();
  33. }
  34. }
  35. }
  36. public Object convertFromXMLToObject(String xmlfile) throws IOException {
  37. FileInputStream is = null;
  38. try {
  39. is = new FileInputStream(xmlfile);
  40. return getUnmarshaller().unmarshal(new StreamSource(is));
  41. } finally {
  42. if (is != null) {
  43. is.close();
  44. }
  45. }
  46. }
  47. }

测试

  1. import org.springframework.context.ApplicationContext;
  2. import org.springframework.context.support.ClassPathXmlApplicationContext;
  3. import com.mdf.springoxm.Customer;
  4. import com.mdf.springoxm.oxmDemo;
  5. import java.io.IOException;
  6. public class Main {
  7. private static final String XML_FILE_NAME = "customer.xml";
  8. public static void main(String[] args) throws IOException {
  9. ApplicationContext appContext = new ClassPathXmlApplicationContext("applicationContext.xml");
  10. oxmDemo converter = (oxmDemo) appContext.getBean("oxmDemo");
  11. Customer customer = new Customer();
  12. customer.setName("yiibai");
  13. customer.setFlag(true);
  14. customer.setSex("Haikou haidiandao");
  15. System.out.println("Convert Object to XML!");
  16. //from object to XML file
  17. converter.convertFromObjectToXML(customer, XML_FILE_NAME);
  18. System.out.println("Done \n");
  19. System.out.println("Convert XML back to Object!");
  20. //from XML to object
  21. Customer customer2 = (Customer)converter.convertFromXMLToObject(XML_FILE_NAME);
  22. System.out.println(customer2);
  23. System.out.println("Done");
  24. }
  25. }

测试结果:

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

OXM的更多相关文章

  1. spring oxm入门(包含demo)

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

  2. Spring 4 官方文档学习(十)数据访问之OXM

    http://docs.spring.io/spring/docs/current/spring-framework-reference/html/oxm.html Java Object 与 XML ...

  3. Spring oxm入门实例

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

  4. Spring之初体验

                                     Spring之初体验 Spring是一个轻量级的Java Web开发框架,以IoC(Inverse of Control 控制反转)和 ...

  5. SpingMVC 核心技术帮助文档

    声明:本篇文档主要是用于参考帮助文档,没有实例,但几乎包含了SpringMVC 4.2版本的所有核心技术,当前最新版本是4.3,4.2的版本已经经是很新的了,所以非常值得大家一读,对于读完这篇文档感觉 ...

  6. [spring]03_装配Bean

    3.1 JavaBean 3.1.1 JavaBean 是什么 JavaBean 是一种JAVA语言写成的可重用组件. 为写成JavaBean,类必须是具体的和公共的,并且具有无参数的构造器. Jav ...

  7. spring笔记6 spring IOC的中级知识

    1,spring ioc的整体流程,xml配置 spring ioc初始化的流程结合上图 步骤编号 完成的工作 1 spring容器读取配置文件,解析称注册表 2 根据注册表,找到相应的bean实现类 ...

  8. springmvc<一>一种资源返回多种形式【ContentNegotiatingViewResolver】

    restful服务中一个重要的特性就是一种资源可以有多种表现形式,在springmvc中可以使用ContentNegotiatingViewResolver这个视图解析器来实现这种方式. 描述资源的三 ...

  9. Spring_的jar详细说明

    org.springframework.aop ——Spring的面向切面编程,提供AOP(面向切面编程)的实现 org.springframework.asm——spring 2.5.6的时候需要a ...

随机推荐

  1. EL表达式概述

    E L(Expression Language) 目的:为了使JSP写起来更加简单.表达式语言的灵感来自于 ECMAScript 和 XPath 表达式语言,它提供了在 JSP 中简化表达式的方法. ...

  2. Android代码混淆官方实现方法

    首先查看一下 “project.properties” 这个文件: # This file is automatically generated by Android Tools.# Do not m ...

  3. OC知识梳理-NSArray与NSMutableArray相关知识

    知识普及: 1.数组中的元素在系统中都会有其默认对应的下标,下标是一个整形的数字,默认从0开始. 例:NSArray *arr3 = @["345","234" ...

  4. C语言的判断语句

    // // main.c // homeWork1222 //// #include <stdio.h> int main(int argc, const char * argv[]) { ...

  5. Silverlight项目笔记2:.svc处理程序映射缺失导致的WCF RIA Services异常

    在确定代码.编译结果和数据库都正常的情况下,无法从数据库取到数据.错误提示:Sysyem.Net.WebException:远程服务器返回了错误:NotFound,监听发现请求数据库的服务异常,访问相 ...

  6. android 短信助手demo

    关于意图Intent: 显式意图:必须指定要激活的组件的完整包名和类名(应用程序之间耦合在一起) 一般激活自己应用的组件的时候采用显式意图 隐式意图:只需要指定动作和数据就可以(好处是应用程序之间没有 ...

  7. Effective Java 06 Eliminate obsolete object references

    NOTE Nulling out object references should be the exception rather than the norm. Another common sour ...

  8. 主流Web服务器一览

    概念Web服务器是可以向发出请求的浏览器提供文档的程序. 1.服务器是一种被动程序:只有当Internet上运行在其他计算机中的浏览器发出请求时,服务器才会响应. 2.最常用的Web服务器是Apach ...

  9. C语言杂谈(三)存储类别

    本文讨论C语言中的存储类别,包括数据在内存的存储.变量的存储类别.函数的存储类别.生存周期.下图为计算机的存储空间,有寄存器和内存. 一.存储区域 1.寄存器:存放立即参加运算的数据. 2.系统区:存 ...

  10. win10搭建代理服务器实现绕过校园网的共享限制--从入门到放弃

    博主所在学校特别坑爹,校园网被电信一家垄断了,而且最恶心的还是电信要求一条网线只能供一台电脑上网,不许接路由器共享网络= =- (还有电信2M价格是380+每年,20m是500每年,而且网速都很慢= ...