这里先介绍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里选择的)