Spring 对象XML映射

简介: OXM简介我们都知道对象关系映射(ORM),用来将Java对象和关系型数据库的数据进行映射。Spring也提供了一套类似的映射机制,用来将Java对象和XML文件进行映射。

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。

<bean id="castorMarshaller" class="org.springframework.oxm.castor.CastorMarshaller"/>

我们来定义一个实体类来进行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默认情况下会将简单类型处理为属性,引用类型处理为子元素。

<?xml version="1.0" encoding="UTF-8"?>
<user age="24" id="1"><name>yitian</name></user>

各种序列化器

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

JAXB

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

    <bean id="jaxb2Marshaller" class="org.springframework.oxm.jaxb.Jaxb2Marshaller">
        <property name="classesToBeBound">
            <list>
                <value>foo.bar.Bean1</value>
                <value>foo.bar.Bean2</value>
            </list>
        </property>
        <property name="schema" value="classpath:foo.xsd"/>
    </bean>

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

<oxm:jaxb2-marshaller id="marshaller">
    <oxm:class-to-be-bound name="foo.bar.Bean1"/>
    <oxm:class-to-be-bound name="foo.bar.Bean2"/>
    ...
</oxm:jaxb2-marshaller>

Castor

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

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

<beans>
    <bean id="castorMarshaller" class="org.springframework.oxm.castor.CastorMarshaller" >
        <property name="mappingLocation" value="classpath:mapping.xml" />
    </bean>
</beans>

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

<oxm:castor-marshaller id="marshaller" mapping-location="classpath:org/springframework/oxm/castor/mapping.xml"/>

XMLBeans(已过时)

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

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

<bean id="xmlBeansMarshaller" class="org.springframework.oxm.xmlbeans.XmlBeansMarshaller" />

或者使用oxm命名空间。

<oxm:xmlbeans-marshaller id="marshaller"/>

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

JiBX

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

JibxMarshaller同时实现了Marshaller和Unmarshaller。

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

    <bean id="jibxFlightsMarshaller" class="org.springframework.oxm.jibx.JibxMarshaller">
        <property name="targetClass">foo.Bar</property>
    </bean>

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

<oxm:jibx-marshaller id="marshaller" target-class="org.springframework.ws.samples.airline.schema.Flight"/>

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

XStream

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

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

    <bean id="xstreamMarshaller" class="org.springframework.oxm.xstream.XStreamMarshaller">
        <property name="aliases">
            <props>
                <prop key="bar">foo.Bar</prop>
            </props>
        </property>
    </bean>

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

<bean id="xstreamMarshaller" class="org.springframework.oxm.xstream.XStreamMarshaller">
    <property name="supportedClasses" value="foo.Bar"/>
    ...
</bean>

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

相关文章
|
30天前
|
存储 Java 文件存储
微服务——SpringBoot使用归纳——Spring Boot使用slf4j进行日志记录—— logback.xml 配置文件解析
本文解析了 `logback.xml` 配置文件的详细内容,包括日志输出格式、存储路径、控制台输出及日志级别等关键配置。通过定义 `LOG_PATTERN` 和 `FILE_PATH`,设置日志格式与存储路径;利用 `&lt;appender&gt;` 节点配置控制台和文件输出,支持日志滚动策略(如文件大小限制和保存时长);最后通过 `&lt;logger&gt;` 和 `&lt;root&gt;` 定义日志级别与输出方式。此配置适用于精细化管理日志输出,满足不同场景需求。
133 1
|
30天前
|
XML Java 数据库连接
微服务——SpringBoot使用归纳——Spring Boot集成MyBatis——基于 xml 的整合
本教程介绍了基于XML的MyBatis整合方式。首先在`application.yml`中配置XML路径,如`classpath:mapper/*.xml`,然后创建`UserMapper.xml`文件定义SQL映射,包括`resultMap`和查询语句。通过设置`namespace`关联Mapper接口,实现如`getUserByName`的方法。Controller层调用Service完成测试,访问`/getUserByName/{name}`即可返回用户信息。为简化Mapper扫描,推荐在Spring Boot启动类用`@MapperScan`注解指定包路径避免逐个添加`@Mapper`
52 0
|
4月前
|
XML Java 数据格式
【SpringFramework】Spring IoC-基于XML的实现
本文主要讲解SpringFramework中IoC和DI相关概念,及基于XML的实现方式。
136 69
|
4月前
|
XML Java 数据格式
使用idea中的Live Templates自定义自动生成Spring所需的XML配置文件格式
本文介绍了在使用Spring框架时,如何通过创建`applicationContext.xml`配置文件来管理对象。首先,在resources目录下新建XML配置文件,并通过IDEA自动生成部分配置。为完善配置,特别是添加AOP支持,可以通过IDEA的Live Templates功能自定义XML模板。具体步骤包括:连续按两次Shift搜索Live Templates,配置模板内容,输入特定前缀(如spring)并按Tab键即可快速生成完整的Spring配置文件。这样可以大大提高开发效率,减少重复工作。
使用idea中的Live Templates自定义自动生成Spring所需的XML配置文件格式
|
4月前
|
存储 Java Spring
【Spring】获取Bean对象需要哪些注解
@Conntroller,@Service,@Repository,@Component,@Configuration,关于Bean对象的五个常用注解
110 12
|
4月前
|
存储 Java 应用服务中间件
【Spring】IoC和DI,控制反转,Bean对象的获取方式
IoC,DI,控制反转容器,Bean的基本常识,类注解@Controller,获取Bean对象的常用三种方式
104 12
|
4月前
|
XML Java 数据格式
Spring容器Bean之XML配置方式
通过对以上内容的掌握,开发人员可以灵活地使用Spring的XML配置方式来管理应用程序的Bean,提高代码的模块化和可维护性。
106 6
|
4月前
|
XML 安全 Java
Spring Boot中使用MapStruct进行对象映射
本文介绍如何在Spring Boot项目中使用MapStruct进行对象映射,探讨其性能高效、类型安全及易于集成等优势,并详细说明添加MapStruct依赖的步骤。
118 0
|
11月前
|
存储 Java 数据库
Spring的使用-Bean对象的储存和获取/Bea对象的作用域与生命周期
Spring的使用-Bean对象的储存和获取/Bea对象的作用域与生命周期
|
设计模式 前端开发 Java
Spring Bean对象生命周期
Spring Bean对象生命周期
450 0