Spring OXM
Spring OXM
-
Spring OXM 概述
Spring OXM 是Spring3.0的一个新特性,为主流O/X Mapping组件提供了统一层抽象和封装,而在Spring4.0中OXM没有增加更多新特性。O/X映射器这个概念并不新鲜,O 代表 Object,X代表XML,目的是在Java对象和XML之间进行转换操作。Spring OXM 不仅仅屏蔽了各O/XMapping组件实现的差异性,而且还提供了统一,高效的编程模型。Spring OXM的结构框架如下所示:
Marshaller和Unmarshaller是Spring OXM的两个核心接口。实现Marshaller接口可以实现从Java对象到XML的映射转换,实现Unmarshaller接口可实现从XML到Java对象的映射转换。
Marshaller接口定义:
<pre spellcheck="false" class="md-fences md-end-block ty-contain-cm modeLoaded" lang="java" cid="n522" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: Monaco, Consolas, "Andale Mono", "DejaVu Sans Mono", monospace; margin-top: 0px; margin-bottom: 20px; background-color: rgb(51, 51, 51); font-size: 0.9rem; display: block; break-inside: avoid; text-align: left; white-space: normal; position: relative !important; padding: 10px 10px 10px 30px; width: inherit; background-position: initial initial; background-repeat: initial initial;">public interface Marshaller {
//判断支持的编组类类型
boolean supports(Class<?> class);
//对传入对象进行编组操作
void marshal(Object graph, Result result) throws IOException, XmlMappingException;
}</pre>
Marshaller接口中提供了两个方法,其中supports()方法用于判断支持的编组类类型;marshal 方法用于对对象进行编组操作,其中graph参数为目标转换对象,result参数为JDK提供的XML转换接口,实现此接口的对象包含构建转换结果树所需的信息。**Spring OXM支持的Result转换实现类有 DOMResult,SAXResult,StreamResult,StaxResult**,其中 DOMResult,SAXResult,StreamResult为JDK提供的实现类,StaxResult为Spring OXM提供的扩展类。
Unmarshaller接口定义
<pre spellcheck="false" class="md-fences md-end-block ty-contain-cm modeLoaded" lang="java" cid="n532" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: Monaco, Consolas, "Andale Mono", "DejaVu Sans Mono", monospace; margin-top: 0px; margin-bottom: 20px; background-color: rgb(51, 51, 51); font-size: 0.9rem; display: block; break-inside: avoid; text-align: left; white-space: normal; position: relative !important; padding: 10px 10px 10px 30px; width: inherit; background-position: initial initial; background-repeat: initial initial;">public interface Unmarshaller {
//
boolean supports(Class<?> clazz);
//
Object unmarshal(Source source) throws IOException, XmlMappingException;
}</pre>
Unmarshaller接口提供了两个方法,其中supports方法用于判断支持的反编组类类型,unmarshal方法用于将输入源对象进行反编组操作,其中source参数为目标输入源对象,Source参数为JDK提供的输入源接口,实现此接口的对象包含充当源输入(XML源或转换指令)所需的信息。Spring OXM 支持的Source输入源实现类有 DOMSource,SAXSource,StreamSource,StaxSource,其中 DOMSource,SAXSource,StreamSource为JDK提供实现类,StaxSource为Spring OXM提供的扩展类。
Spring OXM统一封装底层的O/XMapping组件异常,将各O/XMapping组件原始异常对象包装到Spring自身专为OXM建立的运行时异常 XmlMappingException中,并通过MarshallerFailureException和UnmarshallerFailureException处理编组和反编组操作之间的区别。
-
整合OXM实现者
Spring OXM默认提供目前几个主流O/X Mapping组件的实现,包括XStream,XMLBeans,Castor,JiBX,JAXB。这些O/XMapping组件统一实现Spring OXM 的两个核心接口 Marshaller和Unmarshaller。
要使用Spring OXM 的 O/X功能,首先需要一个在Java对象和XML之间来回转换的组件,并将上文提到的XStream,JAXB等的相应的类库添加到工程中。各O/XMapping组件对应的实现类如下:
O/X Mapping组件 Spring OXM实现类 XStream org.springframework.oxm.xstream.XStreamMarshaller Castor org.springframework.oxm.castor.CastorMarshaller JiBX org.springframework.oxm.jibx.JibxMarshaller JAXB org.springframework.oxm.jaxb.Jaxb2Marshaller -
如何在Spring中进行配置
到目前为止,我们已经介绍了各 O/X Mapping组件的使用方法以及Spring OXM整体框架,接下来介绍如何在Spring中整合这些 O/XMapping组件。
spring.schemas 文件
<pre spellcheck="false" class="md-fences md-end-block ty-contain-cm modeLoaded" lang="xml-dtd" cid="n588" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: Monaco, Consolas, "Andale Mono", "DejaVu Sans Mono", monospace; margin-top: 0px; margin-bottom: 20px; background-color: rgb(51, 51, 51); font-size: 0.9rem; display: block; break-inside: avoid; text-align: left; white-space: normal; position: relative !important; padding: 10px 10px 10px 30px; width: inherit; background-position: initial initial; background-repeat: initial initial;">http://www.springframework.org/schema/oxm/spring-oxm-3.0.xsd=org/springframework/oxm/config/spring-oxm-3.0.xsd
http://www.springframework.org/schema/oxm/spring-oxm-3.1.xsd=org/springframework/oxm/config/spring-oxm-3.1.xsd
http://www.springframework.org/schema/oxm/spring-oxm-3.2.xsd=org/springframework/oxm/config/spring-oxm-3.2.xsd
http://www.springframework.org/schema/oxm/spring-oxm-4.0.xsd=org/springframework/oxm/config/spring-oxm-4.0.xsd
http://www.springframework.org/schema/oxm/spring-oxm-4.1.xsd=org/springframework/oxm/config/spring-oxm-4.1.xsd
http://www.springframework.org/schema/oxm/spring-oxm-4.2.xsd=org/springframework/oxm/config/spring-oxm-4.2.xsd
http://www.springframework.org/schema/oxm/spring-oxm.xsd=org/springframework/oxm/config/spring-oxm-4.2.xsd</pre>spring-oxm-4.2.xsd文件:
<pre spellcheck="false" class="md-fences md-end-block ty-contain-cm modeLoaded" lang="xml" cid="n594" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: Monaco, Consolas, "Andale Mono", "DejaVu Sans Mono", monospace; margin-top: 0px; margin-bottom: 20px; background-color: rgb(51, 51, 51); font-size: 0.9rem; display: block; break-inside: avoid; text-align: left; white-space: normal; position: relative !important; padding: 10px 10px 10px 30px; width: inherit; background-position: initial initial; background-repeat: initial initial;"><?xml version="1.0" encoding="UTF-8" standalone="no"?>
<xsd:schema xmlns="http://www.springframework.org/schema/oxm" xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:beans="http://www.springframework.org/schema/beans"
xmlns:tool="http://www.springframework.org/schema/tool"
targetNamespace="http://www.springframework.org/schema/oxm"
elementFormDefault="qualified"
attributeFormDefault="unqualified">
<xsd:import namespace="http://www.springframework.org/schema/beans" schemaLocation="http://www.springframework.org/schema/beans/spring-beans-4.2.xsd"/>
<xsd:import namespace="http://www.springframework.org/schema/tool" schemaLocation="http://www.springframework.org/schema/tool/spring-tool-4.2.xsd"/>
<xsd:annotation>
<xsd:documentation>
Defines the elements used in Spring's Object/XML Mapping integration.
</xsd:documentation>
</xsd:annotation>
<xsd:element name="jaxb2-marshaller">
<xsd:complexType>
<xsd:annotation>
<xsd:documentation source="java:org.springframework.oxm.jaxb.Jaxb2Marshaller">
Defines a JAXB2 Marshaller.
</xsd:documentation>
<xsd:appinfo>
<tool:annotation>
<tool:exports type="org.springframework.oxm.jaxb.Jaxb2Marshaller"/>
</tool:annotation>
</xsd:appinfo>
</xsd:annotation>
<xsd:complexContent>
<xsd:extension base="beans:identifiedType">
<xsd:sequence>
<xsd:element name="class-to-be-bound" minOccurs="0" maxOccurs="unbounded">
<xsd:complexType>
<xsd:attribute name="name" type="classType" use="required"/>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
<xsd:attribute name="context-path" type="xsd:string">
<xsd:annotation>
<xsd:documentation>The JAXB context path.</xsd:documentation>
</xsd:annotation>
</xsd:attribute>
</xsd:extension>
</xsd:complexContent>
</xsd:complexType>
</xsd:element>
<xsd:element name="jibx-marshaller">
<xsd:complexType>
<xsd:annotation>
<xsd:documentation source="java:org.springframework.oxm.jibx.JibxMarshaller">
Defines a JiBX Marshaller.
</xsd:documentation>
<xsd:appinfo>
<tool:annotation>
<tool:exports type="org.springframework.oxm.jibx.JibxMarshaller"/>
</tool:annotation>
</xsd:appinfo>
</xsd:annotation>
<xsd:complexContent>
<xsd:extension base="beans:identifiedType">
<xsd:attribute name="target-class" type="classType">
<xsd:annotation>
<xsd:documentation>The target class to be bound with JiBX.</xsd:documentation>
</xsd:annotation>
</xsd:attribute>
<xsd:attribute name="target-package" type="xsd:string">
<xsd:annotation>
<xsd:documentation>The target package for the JiBX binding.</xsd:documentation>
</xsd:annotation>
</xsd:attribute>
<xsd:attribute name="binding-name" type="xsd:string">
<xsd:annotation>
<xsd:documentation>The binding name used by this marshaller.</xsd:documentation>
</xsd:annotation>
</xsd:attribute>
</xsd:extension>
</xsd:complexContent>
</xsd:complexType>
</xsd:element>
<xsd:element name="castor-marshaller">
<xsd:complexType>
<xsd:annotation>
<xsd:documentation
source="java:org.springframework.oxm.castor.CastorMarshaller">
Defines a Castor Marshaller.
</xsd:documentation>
<xsd:appinfo>
<tool:annotation>
<tool:exports type="org.springframework.oxm.castor.CastorMarshaller" />
</tool:annotation>
</xsd:appinfo>
</xsd:annotation>
<xsd:complexContent>
<xsd:extension base="beans:identifiedType">
<xsd:attribute name="encoding" type="xsd:string">
<xsd:annotation>
<xsd:documentation>The encoding to use for stream reading.</xsd:documentation>
</xsd:annotation>
</xsd:attribute>
<xsd:attribute name="target-class" type="classType">
<xsd:annotation>
<xsd:documentation>The target class to be bound with the Castor marshaller.</xsd:documentation>
</xsd:annotation>
</xsd:attribute>
<xsd:attribute name="target-package" type="xsd:string">
<xsd:annotation>
<xsd:documentation>The target package that contains Castor descriptor classes.</xsd:documentation>
</xsd:annotation>
</xsd:attribute>
<xsd:attribute name="mapping-location" type="xsd:string">
<xsd:annotation>
<xsd:documentation>The path to the Castor mapping file.</xsd:documentation>
</xsd:annotation>
</xsd:attribute>
</xsd:extension>
</xsd:complexContent>
</xsd:complexType>
</xsd:element>
<xsd:simpleType name="classType">
<xsd:annotation>
<xsd:documentation source="java:java.lang.Class">A class supported by a marshaller.</xsd:documentation>
<xsd:appinfo>
<tool:annotation kind="direct">
<tool:expected-type type="java.lang.Class"/>
<tool:assignable-to restriction="class-only"/>
</tool:annotation>
</xsd:appinfo>
</xsd:annotation>
<xsd:union memberTypes="xsd:string"/>
</xsd:simpleType>
</xsd:schema></pre>