Spring中的Object/XML映射详解

2010-3-9    来源:51cto   作者:Brian M. Carey    我要评论
   | |

导读:Spring正在成为JavaEE社区内一个非常受欢迎的框架,Spring的最新版本的特性之一是它的Object/XML(O/X)映射支持,这个API支持开发人员在Java对象和XML之间来回转换。在本文中,您将学习如何使用Spring中的Object/XML映射特性并了解它的优势。

关键词:Spring Java Object/XML(O/X)映射

 
正在加载数据...

  Spring作为Java应用程序框架,已在Java开发社区中得到广泛使用,SpringSource近日发布了最新版本Spring 3.0.1版本。文章主要针对Spring中的Object/XML映射,分析使用Object/XML映射的特性与优势。

  Spring以其流行的科技词汇而著名,比如“dependencyinjection(依赖项注入)”、“inversionofcontrol(控制反转)”和“aspect-orientedprogramming(面向方面编程)”等。它还支持Model-View-Controller(MVC)模式,很好地兼容用于数据访问的各种数据库驱动程序。

  另外,它支持事务处理、单元测试、批处理和安全性。鉴于Spring的良好声誉和悠久历史,它通常是应用程序快速开发的首选框架。但是,最大的好处也许是:Spring是免费的。

  Object/XML映射是什么?

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

  例如,您可能有一个带有几个属性的简单bean,且您的业务需要将那个Java对象转换为一个XML文档。Spring的O/XMapper能够为您解决那个问题。如果反过来,您需要将一个XML文档转换为一个简单Javabean,Spring的O/XMapper也能胜任,有一点需要注意:SpringO/XMapper只是定义由流行的第三方框架实现的统一的界面。要利用Spring的O/X功能,您需要一个在Java对象和XML之间来回转换的实用程序。Castor就是这样一个流行的第三方工具,本文将使用这个工具。其他这样的工具包括XMLBeans、JavaArchitectureforXMLBinding(JAXB)、JiBX和XStream。

  编组和解组

  进行O/X映射时,您经常会看到编组(marshalling)和解组(unmarshalling)这两个术语。编组指将Javabean转换成XML文档的过程,这意味着Javabean的所有字段和字段值都将作为XML元素或属性填充到XML文件中。有时,编组也称为序列化(serializing)。

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

  使用Spring的O/XMapper的好处

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

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

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

  一个简单的演示

  现在您已经了解了Spring的O/XMapper的背景和基础知识,可以检验它的使用方法了。在本文中,您首先创建一个简单的Spring应用程序,该程序独立于任何JavaEnterprise依赖项。然后,您创建一个简单的Java类,它访问Spring的配置文件来实例化该类并注入O/X依赖项。参见下载部分获取所有源代码文件(包括配置文件)的链接。

  编码

  首先应该注意Spring配置文件。清单1是应用程序用于执行编组和解组操作的配置文件。注意,这个文件必须在运行时位于类路径中,清单1.配置文件:

以下是引用片段:
<beansxmlnsbeansxmlns="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">
  <beanidbeanid="oxmExample"class="com.xyz.OXMExample">
 <propertynamepropertyname="marshaller"ref="castorMarshaller"/> <propertynamepropertyname="unmarshaller"ref="castorMarshaller"/>
 </bean>
 <beanidbeanid="castorMarshaller"class="org.springframework.oxm.castor.CastorMarshaller"> <propertynamepropertyname="mappingLocation"value="classpath:mapping.xml"/> </bean> </beans> 

  如您所见,这个配置文件只定义了两个bean,这是为了简便起见。第一个bean是用于执行演示的类:com.xyz.OXMExample。与该类关联的两个属性使用依赖项注入,它们都使用castorMarshallerbean的一个实例注入。这是在Spring框架中定义bean的标准方法,经验丰富的Spring开发人员很快就会意识到这一点。

  另一个bean是castorMarshallerbean本身,它是org.springframework.oxm.castor.CastorMarshaller的一个实例,org.springframework.oxm.castor.CastorMarshaller主要用于包装Castor框架。如前所述,使用Spring的Object/XML功能需要使用一个第三方O/X框架。在本例中,这个第三方产品是Castor。还要注意,有一个属性使用castorMarshaller定义,那是用于在Javabean和XML输出之间来回映射的映射文件。这个文件称为mapping.xml,它必须在运行时位于类路径中。我将稍后解释mapping.xml文件的内容。清单2实际执行O/X映射器的代码的部分清单。它是一个简单的Java类,清单2.OXMExample类:

以下是引用片段:
publicclassOXMExample{
  privatestaticfinalStringFILE_NAME="simplebean.xml";
  privateSimpleBeansimpleBean;
   privateMarshallermarshaller;
  privateUnmarshallerunmarshaller;
   publicvoidsetMarshaller(Marshallermarshaller){
  this.marshaller=marshaller;  }
   publicvoidsetUnmarshaller(Unmarshallerunmarshaller){
  this.unmarshaller=unmarshaller;  }   
publicvoidsaveSimpleBean()throwsIOException{  FileOutputStreamos=null;
  try{  os=newFileOutputStream(FILE_NAME);
  this.marshaller.marshal(simpleBean,newStreamResult(os));
  }finally{  if(os!=null){  os.close();  }  }  }
   publicvoidloadSimpleBean()throwsIOException{  FileInputStreamis=null;
  try{  is=newFileInputStream(FILE_NAME);
  this.simpleBean =(SimpleBean)this.unmarshaller.unmarshal(newStreamSource(is)); 
 }finally{  if(is!=null){  is.close();
  }  }  }   
publicstaticvoidmain(String[]args)throwsIOException{
  ApplicationContextappContext =newClassPathXmlApplicationContext("applicationContext.xml");  OXMExampleex=(OXMExample)appContext.getBean("oxmExample");  ex.go();  } 
  privatevoidgo()throwsIOException{  simpleBean=getSimpleBean();
   saveSimpleBean();  loadSimpleBean();   System.out.println("name:"+simpleBean.getName());  System.out.println("jobdescription:"+simpleBean.getJobDescription());  System.out.println("age:"+simpleBean.getAge());  System.out.println("executive:"+simpleBean.isExecutive());  } 
   privateSimpleBeangetSimpleBean(){  SimpleBeansimpleBean=newSimpleBean();  simpleBean.setAge(35);  simpleBean.setExecutive(false);  simpleBean.setJobDescription("Janitor");
  simpleBean.setName("MisterJones");   returnsimpleBean;
   }  } 

  解释清单2,必须首先介绍main方法,因为该方法将先执行。然后再接着介绍清单2,首先,在main方法中,您的代码捕获Spring应用程序的上下文,就是您在清单1中看到的配置文件。这个文件必须在类路径中,否则运行代码将产生一个异常。
当您获得应用程序上下文时,OXMExample的一个实例从该配置文件中提供的定义创建。注意,这个bean在代码中的名称(oxmExample)与配置文件中定义的名称(见清单1)一致。创建OXMExample的一个实例后,调用go()方法。这有点反常,因为Spring框架实例化一个已经从命令行运行的对象,但那只是为了实现演示目的而进行的简化。go()方法在打印结果数据前完成3个任务:

  1.创建SimpleBean的一个实例。
  2.编组该实例。
  3.解组从编组创建的XML文档。

  您使用getSimpleBean()方法实例化一个包含一个虚拟员工的信息的SimpleBean对象。这个信息包含年龄(一个整数)、工作描述(一个字符串)、姓名(一个字符串)和该员工是否是执行官(一个布尔型)。您使用测试数据和返回调用者的返回对象(在本例中为go()方法)填充字段。您在编组发生时将这个bean写入一个XML文件,在解组发生时读取那个XML文件的内容。

  saveSimpleBean()方法执行编组。首先,您获得一个指向simplebean.xml的对象,然后,您使用编组器对象(通过Spring的依赖项注入实例化)调用marshal方法。这个方法需要两个参数:

  ◆要被编组的对象(本例中为SimpleBean实例)
  ◆一个StreamResult对象,它基本上表示一个XML输出抽象

  loadSimpleBean()方法执行解组。首先,您获取一个指向simplebean.xml的FileInputStream对象,然后,您使用解组器对象(通过Spring的依赖项注入实例化)调用unmarshal方法。唯一需要的参数是一个包装FileInputStream对象的StreamSource对象。注意,解组将创建一个泛型对象,因此您必须将其显式设置为SimpleBean类型。

  即使这个类和Spring配置文件已经就绪,您也还没有准备好运行这段代码。还记得清单1中的映射文件吗?您还需要定义那个映射文件。定义代码如清单3所示,而且,再说一遍,它也必须在运行时位于类路径中。清单3.mapping.xml文件:

以下是引用片段:
<mapping> <classnameclassname="com.xyz.SimpleBean"> <map-toxmlmap-toxml="simplebean"/> <fieldnamefieldname="age"type="integer"> <bind-xmlnamebind-xmlname="age"node="element"/> </field> <fieldnamefieldname="executive"type="boolean"> <bind-xmlnamebind-xmlname="is-executive"node="element"/> </field> <fieldnamefieldname="jobDescription"type="string"> <bind-xmlnamebind-xmlname="job"node="element"/> </field> <fieldnamefieldname="name"type="string"> <bind-xmlnamebind-xmlname="name"node="element"/> </field> </class> </mapping> 

  清单3中的映射文件特定于Object/XML映射的Castor实现。第一个元素(class)定义要映射到一个XML输出的类。您必须指定完整路径,map-to元素提供XML文件的根元素的名称。这很重要,因为XML规范规定,每个XML文件必须有一个根元素。

  每个field元素都将被映射到SimpleBean类中的一个特定字段。每个field元素的bind-xml子元素用于指定关于该字段的特定于XML的信息,如对应的XML元素的名称,每个字段的值应该是一个元素值还是一个属性值。如您所见,在本例中,所有值都是元素值。

  测试

  尽管代码已经编写完成,但在执行这个应用程序之前,您必须处理一些依赖项,特定于Spring的依赖项有:

以下是引用片段:
org.springframework.asm-3.0.0.M4.jar
  org.springframework.beans-3.0.0.M4.jar
  org.springframework.context-3.0.0.M4.jar
  org.springframework.core-3.0.0.M4.jar
  org.springframework.expression-3.0.0.M4.jar
  org.springframework.oxm-3.0.0.M4.jar  

  特定于Castor的依赖项有:

  castor-1.3-core.jar  castor-1.3-xml.jar 您还需要commons-logging-1.1.1.jar和log4j-1.2.15.jar,因为Spring框架需要它们,所有这些JavaArchive(JAR)文件必须在运行时位于类路径中。如果您在没有这些依赖项的情况下试图运行代码,您很可能会收到一个异常,指出某个类没有找到。如果遇到这种情况,只需双击您的类路径,确保所有的必要依赖项已就绪。事实上,要成功编译这段代码,您需要大部分JAR文件。

  您可以使用您钟爱的IDE或只是使用命令行来运行OXMExample.class。要从命令行运行,只需从您的工作目录输入java-cp[classpath]OXMExample,这里的[classpath]是指向刚才提到的所有依赖项(JAR文件和配置文件)的类路径。首次运行该程序后,一个名为simplebean.xml的新文件将出现在您的工作目录中。该文件的内容应该如清单4所示,清单4.simplebean.xml文件:

以下是引用片段:
<?xmlversionxmlversion="1.0"encoding="UTF-8"?>
 <simplebean> <age>35</age>
<is-executive>false</is-executive>
 <job>Janitor</job> <name>MisterJones</name>
 </simplebean> 

  清单4显示了来自应用程序的编组端的输出,而清单5则显示来自应用程序的解组端的结果,这些结果将在您的控制台中显示,清单5.解组输出:

  name:MisterJones  jobdescription:Janitor  age:35  executive:false 现在,您已经成功地完成了您的首次SpringO/X映射测试,现在最好做开发人员应该做的工作:修改代码。向类添加字段并将它们映射到XML文件。删除一些字段并将它们从XML文件中移除。参考Castor文档,尝试一些更复杂的工作,比如嵌套元素。您可以随心所欲地尝试各种可能性。

  结束语

  Spring的O/X映射接口是Spring框架的强大特性。借助它,您不仅可以将XML文档转换为Java对象,还可以将Java对象转换为XML文档。它利用Spring的一个关键优势:依赖项注入。通过结合使用依赖项注入和Spring的O/XMapper,您可以轻松开发一个解决方案,该方案可以使用任一O/X实现,比如Castor、XBeans、JiBX、JAXB和XStream。由于各个特定实现是Spring强大的InversionofControl容器的一部分,开发人员可以在多个特定O/X实现之间轻松切换而无需修改代码。

  Spring的O/XMapper还向开发人员提供一个统一的异常层次结构,这意味着不管您使用哪个第三方实现,抛出的运行时异常都是相同的。再强调一次,这将有利于在多个O/X供应商之间切换,在Java开发社区中,提供XML支持的Java应用程序非常热门并且Spring框架被广泛使用,因此Spring的O/XMapper将受到全世界Java应用程序开发人员的欢迎。


spring
 JSF和Spring的集成
 比较JSF、Spring MVC、Stripes、Struts 2、Tapestry、Wicket(二)
 比较JSF、Spring MVC、Stripes、Struts 2、Tapestry、Wicket(一)
 Spring工作原理探秘(下)
 Spring工作原理探秘(上)
 Spring MVC框架的高级配置
 Spring中的Object/XML映射详解
 Spring与WebLogic Portal的基本交互

原文出处:http://developer.51cto.com/art/201003/186847.htm
 
 
 
 
 
 

Java Web服务

 
现在事件处理的实际情况是:应用需要从范围很广的应用那里收集信息,这些应用,天生缺乏业务事件这种概念意识。
 
Java发端Sun公司多年来由于其对于Java的保护不够努力而饱受争议。OpenJDK的太对许多人来说有点太晚了。
 
甲骨文于上周四对谷歌提起诉讼,声称谷歌的Android移动操作系统侵犯了甲骨文对Java软件的专利权和版权。谷歌广泛使用开放JDK开发包,使得Java开发者可以快速创建Android应用。
 
近年来,Java领域最有影响力的趋势之一是JVM(Java虚拟机)上对于非Java语言的支持的增加。PHP、Groovy、Ruby以及其他的动态脚本语言已经赢得一席之地。
 
Hibernate的对象关系映射器在执行转换对象到关系实体和关系实体到对象的过程中的静止临界任务时,已经获得了广泛认可。

热门技术手册排行

 

随着开源技术越来越成熟,一个稍有开发经验的人通过学习就可以用开源的产品和技术构建一套可用的系统。对于从事软件开发的人员,尤其是对Java或动态语言相关领域的人来说,“开源”也许是他们最喜爱的单词。但是,很多时候我们需要的不仅仅是一个可用的系统,而是希望这个系统开发更简易、性能更高和扩展性更好等。这确实是一个令人头痛的问题。本指南很多地方都是点到为止,要深入了解相关信息的读者请借助参考资料、网站等自行挖掘。

 

本专题分六部分探讨SOA设计模式,当初设计面向服务架构的一大初衷就是降低服务间耦合度,由此提高服务的灵活性和自由度。

 

TOAGF是一个架构框架,简而言之,TOGAF是一种协助发展,验收,运行,使用,和维护架构的工具。它是基于一个迭代(Iterative)的过程模型,支持最佳实践和一套可重用的现有架构资产。

 

业务流程管理(business process management,bpm)不是一个新概念,甚至不是一个新名词。它是从相关的业务流程变革领域,如业务流程改进(bpi)、业务流程重组(bpr)、业务流程革新中发展起来的。流程管理技术也是从早期的工作流管理、eai、流程自动化、流程集成、流程建模、流程优化等技术中发展起来的。

 

ESB(Enterprise Service Bus,企业服务总线)是传统中间件技术与XML、Web服务等技术结合的产物。ESB提供了网络中最基本的连接中枢,是构筑企业神经系统的必要元素。

 

云计算的概念越来越流行,Amazon、Google和IBM是第一批将云计算引入公众视线的公司。云计算就是新的Web2.0,一种既有技术上的市场绽放。

查看更多
 
 

登录TechTarget中国

关闭
本服务仅向TechTarget中国的会员开放,请登录或立即免费注册
电子邮件地址:
请输入您的电子邮件地址
密码:
下次自动登录