OXM
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/beans
- http://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 file
- converter.convertFromObjectToXML(customer, XML_FILE_NAME);
- System.out.println("Done \n");
- System.out.println("Convert XML back to Object!");
- //from XML to object
- Customer 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
- 顶
- 0
OXM的更多相关文章
- spring oxm入门(包含demo)
O/X Mapper 是什么? Spring 3.0 的一个新特性是 O/X Mapper.O/X 映射器这个概念并不新鲜,O 代表 Object,X 代表 XML.它的目的是在 Java 对象(几乎 ...
- Spring 4 官方文档学习(十)数据访问之OXM
http://docs.spring.io/spring/docs/current/spring-framework-reference/html/oxm.html Java Object 与 XML ...
- Spring oxm入门实例
O/XMapper是什么? Spring3.0的一个新特性是O/XMapper.O/X映射器这个概念并不新鲜,O代表Object,X代表XML.它的目的是在Java对象(几乎总是一个plainoldJ ...
- Spring之初体验
Spring之初体验 Spring是一个轻量级的Java Web开发框架,以IoC(Inverse of Control 控制反转)和 ...
- SpingMVC 核心技术帮助文档
声明:本篇文档主要是用于参考帮助文档,没有实例,但几乎包含了SpringMVC 4.2版本的所有核心技术,当前最新版本是4.3,4.2的版本已经经是很新的了,所以非常值得大家一读,对于读完这篇文档感觉 ...
- [spring]03_装配Bean
3.1 JavaBean 3.1.1 JavaBean 是什么 JavaBean 是一种JAVA语言写成的可重用组件. 为写成JavaBean,类必须是具体的和公共的,并且具有无参数的构造器. Jav ...
- spring笔记6 spring IOC的中级知识
1,spring ioc的整体流程,xml配置 spring ioc初始化的流程结合上图 步骤编号 完成的工作 1 spring容器读取配置文件,解析称注册表 2 根据注册表,找到相应的bean实现类 ...
- springmvc<一>一种资源返回多种形式【ContentNegotiatingViewResolver】
restful服务中一个重要的特性就是一种资源可以有多种表现形式,在springmvc中可以使用ContentNegotiatingViewResolver这个视图解析器来实现这种方式. 描述资源的三 ...
- Spring_的jar详细说明
org.springframework.aop ——Spring的面向切面编程,提供AOP(面向切面编程)的实现 org.springframework.asm——spring 2.5.6的时候需要a ...
随机推荐
- NLog 自定义字段 写入 oracle
1.通过Nuget安装NLog 下载,简单入门 请参照 我刚才转的几篇文章,下面我直接贴代码 2.建表语句 create table TBL_LOG ( id ) not null, appname ...
- java多线程系列7-停止线程
本文主要总结在java中停止线程的方法 在java中有以下三种方法可以终止正在运行的线程: 1.使用退出标志 2.使用stop方法强行终止线程,但是不推荐,因为stop和suspend.resume一 ...
- C语言中的自定义函数
C语言中可以使用系统函数也可以使用自己的函数,就是自定义函数 自定义函数分为四种 第一种:无参无返回值的 函数的声明 void sayH(); 函数的实现 void sayH(){ printf(&q ...
- Swift的7大误区
Swift正在完成一个惊人的壮举,它正在改变我们在苹果设备上编程的方式,引入了很多现代范例,例如:函数式编程和相比于OC这种纯面向对象语言更丰富的类型检查. Swift语言希望通过采用安全的编程模式去 ...
- 记录JVM垃圾回收算法
垃圾回收算法可以分为三类,都基于标记-清除(复制)算法: Serial算法(单线程) 并行算法 并发算法 JVM会根据机器的硬件配置对每个内存代选择适合的回收算法,比如,如果机器多于1个核,会对年轻代 ...
- rabbitmq-server启动不了,安装erlang,安装rabbitmq-server
sudo rabbitmq-server start,虽然现实success,但是查看状态,sudo rabbitmq-server status发现居然没有启动,报错是不是端口占用(查看日志/var ...
- CListCtrl中删除多个不连续的行
==================================声明================================== 本文原创,转载在正文中显要的注明作者和出处,并保证文章的完 ...
- VS2010 单文档+多视图+Outlook风格
先来个段子 十年生死两茫茫,喜羊羊,灰太狼.舒克贝塔,蓝猫话凄凉.纵使相逢应不识,圣斗士,美猴王.老夫聊发少年狂,治肾亏,不含糖.锦帽貂裘,千骑用康王.为报倾城随太守,三百年,九芝堂.夜来幽梦忽还乡, ...
- Tomcat报java.lang.ClassNotFoundException: 1catalina.org.apache.juli.FileHandler
最近在生产环境部署Tomcat的时候,在启动的时候,在控制台报"java.lang.ClassNotFoundException: 1catalina.org.apache.juli.Fil ...
- Fragment学习笔记
Fragment为大量型号,尺寸,分辨率的设备提供了一种统一的UI优化方案.将Activity分解为多个Fragment,将极大地提高UI的灵活性,也更容易为一些新的设备配置带来更好的用户体验. on ...