Spring 对象XML映射
发布日期:2021-09-06 21:40:39 浏览次数:1 分类:技术文章

本文共 3568 字,大约阅读时间需要 11 分钟。

OXM简介

我们都知道对象关系映射(ORM),用来将Java对象和关系型数据库的数据进行映射。Spring也提供了一套类似的映射机制,用来将Java对象和XML文件进行映射。这就是Spring的对象XML映射功能,有时候也成为XML的序列化和反序列化。

这套功能的最基本的两个接口就是org.springframework.oxm.Marshallerorg.springframework.oxm.Unmarshaller,前者用于将Java对象转换成XML文件,后者用于将XML文件转换成Java对象。

Marshaller接口如下,它有一个marshal方法,包含要序列化的对象,结果会返回到Result参数上。Result也是一个接口,相应的有几个实现DOMResult、SAXResult和StreamResult,代表几种不同的XML技术。

public interface Marshaller {
void marshal(Object graph, Result result) throws XmlMappingException, IOException;}

Unmarshaller接口也是类似的,它有一个unmarshal方法,将传入的Source反序列化Java对象。相应的Source也有三个实现DOMSource、SAXSource和StreamSource,代表这几种技术。

public interface Unmarshaller {
Object unmarshal(Source source) throws XmlMappingException, IOException;}

基本使用

要使用Spring的OXM功能,需要添加它的依赖。如果使用Gradle,添加下面的依赖项。

compile group: 'org.springframework', name: 'spring-oxm', version: '4.3.6.RELEASE'

Spring提供了几个Marshaller和Unmarshaller接口的实现,用来进行各种转换操作。我们来使用最简单的一个转换器CastorMarshaller,它同时实现了Marshaller和Unmarshaller接口,因此我们可以使用它同时进行序列化和反序列化。同时它不需要其他额外配置。在配置文件中,声明如下一个Bean。

     

我们来定义一个实体类来进行XML序列化和反序列化,方法已省略,只列出字段。

public class User {
private int id;
private String name;
private int age;}

然后我们使用一个方法来测试

public class OXMTest {
private static ApplicationContext context;
private static User user;
@BeforeClass
public static void init() {
context = new ClassPathXmlApplicationContext("classpath:oxm.xml");
user = new User();
user.setName("yitian");
user.setAge(24);
user.setId(1);
}
@Test
public void test() throws IOException {
Marshaller marshaller = context.getBean("castorMarshaller", CastorMarshaller.class);
Unmarshaller unmarshaller = context.getBean("castorMarshaller", CastorMarshaller.class);
//直接输出到标准输出流
Result result = new StreamResult(System.out);
marshaller.marshal(user, result);
System.out.println();
}}

我们可以在控制台上得到类似下面的输出。我们可以看到CastorMarshaller默认情况下会将简单类型处理为属性,引用类型处理为子元素。

     
     
      
       yitian
      
     

各种序列化器

下面来介绍一下Spring实现的一些XML序列化器和反序列化器

JAXB

全称是Java Architecture for XML Binding,为XML表和Java对象之间提供了快速而简单的绑定。org.springframework.oxm.jaxb.Jaxb2Marshaller同时实现了Marshaller和Unmarshaller,所以我们只需要配置一个Jaxb2Marshaller即可。使用JAXB,我们需要设置其classesToBeBound属性指定要绑定哪些类,还可以设置schema属性提供XML的验证。JAXB的详细使用方法请参见其文档。

     
      


foo.bar.Bean1
foo.bar.Bean2



也可以使用oxm命名空间简化配置。

     
      


...

Castor

是一个开源的XML绑定框架。详细使用方法请参见其文档。该类库是一个第三方类库,所以为了使用它还需要引用其类库。CastorMarshaller同时实现了Marshaller和Unmarshaller。

默认情况下不需要配置即可使用。如果需要配置XML绑定,我们可以添加一个绑定文件,绑定文件如何编写参见。

     
      


当然也可以使用oxm命名空间简化。

     

XMLBeans(已过时)

也是一个XML绑定工具,但是它的绑定功能需要Java类继承XmlObject基类。

XmlBeansMarshaller同时实现了Marshaller和Unmarshaller。我们需要添加如下的Bean配置。

     

或者使用oxm命名空间。

     

由于XMLBeans项目已过时,因此Spring相应的XMLBeans类也过时了。

JiBX

.也是一个XML映射类库,它提供和JDO的对象关系映射类似的功能。

JibxMarshaller同时实现了Marshaller和Unmarshaller。

它的Bean配置文件如下。我们使用targetClass属性向其添加要映射的类。

     
      
foo.Bar

或者使用oxm命名空间简化。

     

JibxMarshaller设计为只为一个类进行序列化和反序列化。因此如果要序列化多个类,就需要配置多个JibxMarshaller。

XStream

是一个简单的XML序列化库。

默认情况下XStream不需要任何配置即可使用。如果需要配置的话,可以使用aliases属性自定义生成的XML文件。

     
      


foo.Bar


XStream可以反序列化匿名类,可能会造成安全隐患。所以最好不要使用XStream来反序列化外部加载的XML(例如网络上的XML)。我们还可以使用supportedClasses属性注册类,这样会确保我们只反序列化注册的类。

     
      

...

另外需要注意XStream只是一个XML序列化库,而不是数据绑定库。也就是说它的功能不如前面几个库完善,有些命名空间不支持。因此你无法用XStream来完成类似Web服务的功能。

转载地址:https://blog.csdn.net/weixin_34273479/article/details/89626984 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:mongodb
下一篇:(7)Python赋值机制

发表评论

最新留言

路过,博主的博客真漂亮。。
[***.172.111.71]2022年05月22日 08时54分45秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

最新文章

c语言名人名言大全摘抄,数学名人名言大全摘抄 2019-06-25 13:15:29
linux常用命令kill-9,【Linux常用命令】Linux kill, killall, kill -9, 2019-06-25 13:15:28
三维浮雕软件 linux,三维立体浮雕软件下载 2019-06-25 13:15:28
matlab实现lte上行链路仿真,LTElianluji LTE系统链路级仿真,里面的程序很详尽,适合初学者。 matlab 259万源代码下载- www.pudn.com... 2019-06-25 13:15:27
java 文件校验和,Java如何为zip文件创建校验和? 2019-06-25 13:15:27
sublimerepl php,Sublime text 3实现交互环境 2019-06-25 13:15:26
centos rh php7,Centos7 安装 PHP7最新版的详细教程 2019-06-25 13:15:26
php中如何压缩数据处理,HTTP中几个压缩算法的PHP实现分析 2019-06-25 13:15:25
nginx同时配置php和python,CentOS7 下nginx与PHP的安装与配置 2019-06-25 13:15:24
php 实现贪吃蛇游戏,php编写的贪吃蛇游戏 2019-06-25 13:15:24
headerdoc2html 快速插入注释,[技巧]使用Xcode集成的HeaderDoc自动生成注释和开发文档... 2019-06-25 13:15:23
okgo 缓存html,OKGO 修改缓存数据 2019-06-25 13:15:23
html是网页的核心,网页编辑器的核心 2019-06-25 13:15:22
asp.net mvc 压缩html代码,ASP.NET MVC中使用Bundle打包压缩js和css的方法 2019-06-25 13:15:22
选项卡html怎么做管理者,如何在一个HTML页面中管理两个选项卡? 2019-06-25 13:15:21
html div调用js,在div中调用javascript函数 2019-06-25 13:15:21
html5特殊效果代码,html特效代码大全 2019-06-25 13:15:20
html移上图的效果怎么写,鼠标移动到图片上显示解释文字效果!_html/css_WEB-ITnose... 2019-06-25 13:15:20
html语言中网页主题标记的是,第1章网页标记语言HTML入门基础.PDF 2019-06-25 13:15:19
html 小三角折叠菜单,大饱眼福 7款类型各异的CSS3实用菜单 2019-06-25 13:15:19