Spring OXM-Castor入门

这里先介绍Castor基本的用法,详细介绍就请看后半部分。

基于maven构建工具,完成oxm测试至少需要4个文件:applicationContext.xml,mapping.xml,Cusomer.java,TestOxm.java;

applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
   http://www.springframework.org/schema/beans/spring-beans.xsd
   http://www.springframework.org/schema/context
   http://www.springframework.org/schema/context/spring-context.xsd">

    <context:component-scan base-package="com.my.marshal" />

    <bean id="oxmDemo" class="com.my.marshal.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>

applicationContext.xml文件注册了两个bean对象:一个是OxmDemo自定义类,另一个是CastorMarshaller类:

1.Oxmdemo类:便于测试使用,我们定义了两个属性,将解组和编组的功能拆开来,通过spring的依赖项注入,引用的都是同一个类(所以事实上,如果偷懒的话,自定义一个属性即可,因为castorMarshaller类既有解组的函数,又有编组的函数);

2.CastorMarshaller类:即第三方框架Castor最核心的主类,封装了convertFromXmlToObject(xml到object)和convertFromObjectToXml(object到xml)两个方法;其中需要注入的属性mappingLocation代表了我们mapping文件的路径,这个mapping文件是解组和编组两两转换的前提。(xml文件的解析和生成都是按你自定义的mapping的内容格式来进行的)

mapping.xml

<mapping>
    <class name="com.my.pojo.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>

mapping.xml提供了解组和编组对xml的解析格式。

Customer.java

package com.my.pojo;
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;
    }

    @Override
    public String toString() {
        return "Customer{" +
                "name='" + name + '\'' +
                ", sex='" + sex + '\'' +
                ", flag=" + flag +
                '}';
    }
}

如果说mapping.xml是xml的转换格式,那这里的Customer类就是object想要具体转换的类了,不过这个实现非常简单,我们一般是显示转换的(默认转为object类)。

TestOxm.java

import com.my.marshal.OxmDemo;
import com.my.pojo.Customer;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class TestOxm {
    @Test
    public void testOxm(){
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
        OxmDemo oxmDemo =  (OxmDemo) applicationContext.getBean("oxmDemo");
        Customer customer = new Customer();
        customer.setFlag(true);
        customer.setName("linfine");
        customer.setSex("male");
        System.out.println("converting object to xml!!!");

        String filepath = "customer.xml";
        try {
            oxmDemo.convertFromObjectToXml(customer,filepath);
            System.out.println("success.....");

            System.out.println("converting xml to object!!!");
            Customer customer1 = (Customer) oxmDemo.convertFromXmlToObject(filepath);
            System.out.println("success.....");
            System.out.println("结果为"+customer1);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

TestOxm类是用junit测试框架进行的,使用前记得先导入junit包。

spring需要的依赖:

<!--测试依赖-->
        <!-- https://mvnrepository.com/artifact/junit/junit -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-core</artifactId>
    <version>4.0.2.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-beans -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-beans</artifactId>
    <version>${spring.version}</version>
</dependency>
<dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>4.0.2.RELEASE</version>
</dependency>

<!-- 导入context需要先导入expression -->
<dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-expression</artifactId>
            <version>4.0.2.RELEASE</version>
        </dependency>
        
        <!--oxm功能类jar-->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-oxm</artifactId>
    <version>4.0.2.RELEASE</version>
</dependency>

Castor依赖:

<!--oxm功能类jar-->
<dependency>
    <groupId>org.codehaus.castor</groupId>
    <artifactId>castor</artifactId>
    <version>1.3.2</version>
    <type>pom</type>
</dependency>

<!--oxm功能类jar-->
<dependency>
    <groupId>org.codehaus.castor</groupId>
    <artifactId>castor-xml</artifactId>
    <version>1.3.2</version>
</dependency>

输出结果:
customer.xml

在这里插入图片描述
内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<Customer><flag>true</flag><name>linfine</name><sex>male</sex></Customer>

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

2.应用案例:
例如,您可能有一个带有几个属性的简单bean,且您的业务需要将那个Java对象转换为一个XML文档。Spring的O/XMapper能够为您解决那个问题。如果反过来,您需要将一个XML文档转换为一个简单Javabean,Spring的O/XMapper也能胜任。(xml文档结构简单,是很有用的文本标记语言,类似html,但是它有更强的跨平台性,这意味着它可以被许多的产品使用)

3.实现Spring oxm的第三方框架:
Castor、XBeans、JiBX、JAXB 和 XStream,我们这里使用castor

4.解组和编组的概念:
进行 O/X 映射时,您经常会看到编组(marshalling)和解组(unmarshalling) 这两个术语。

编组 指将 Java bean 转换成 XML 文档的过程,这意味着 Java bean 的所有字段和字段值都将作为 XML 元素或属性填充到 XML 文件中。有时,编组也称为序列化(serializing)。

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

5.使用spring oxm的好处:
好处1:简化配置
好处2:仅提供Marshaller和Unmarshaller两个接口,解耦性高:即用即拿,不用时无需修改多出代码
好处3:统一的异常层次结构,包装了原始异常,能够方便查明异常根源(就是说不管你用的任何实现Spring OXM的第三方框架,它提示的异常类都是统一的,不会随框架使用的变化而变化

6.maven导入的jar包idea应用时识别不了,提示找不到某某类:
1.刷新
2.清理一下缓存
3.在modules里选择你的项目模块,选中dependencies -> 右上角绿色加号 -> 选择从libraries -> 选择所有需要的jar包依赖(这里的选择是从当前项目的settings下libraries里选择的)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值