由于工程需要使用到java bean的相互转换,自己写的工具类有些问题,从同事那里知道dozer能够很好的解决这个问题。于是用了半天时间学习了一下。由于时间太短,只学会了大概使用。待有时间闲下来之后再仔细研究一番。
1.dozer可以灵活的处理复杂类型之间的映射,包括双向映射,递归映射。并且可以通过xml文件进行相关配置,可以最大灵活化。
2.dozer依赖于一些第三方jar包:slf4j.jar,commons-lang.jar,commons-beanutil.jar, commons-loggin.jar
dozer的maven映射为:
<dependency>
<groupId>net.sf.dozer</groupId>
<artifactId>dozer</artifactId>
<version>5.4.0</version>
</dependency>
3.dozer有两种映射方式,但都是生成Mapper实体,本人采用的DozerBeanMapper实现类。
a.非xml配置型转换。
private static Mapper mapper;
public static Mapper getMapperInstance(){
if(mapper==null){
mapper = new DozerBeanMapper();
}
return mapper;
}
包装的两种转换方法:
/**
* bean转换
* @param objs 源对象
* @param objt 目标对象
* @return
*/
public static Object Convert(Object objs, Object objt){
if(objs!=null&&objt!=null){
Mapper mapper = getMapperInstance();
mapper.map(objs, objt);
return objt;
}
return null;
}
/**
* bean转换
* @param objs
* @param c
* @return
*/
public static <T> T Convert(Object objs, Class<T> c){
if(objs!=null&&c!=null){
Mapper mapper = getMapperInstance();
return mapper.map(objs, c);
}
return null;
}
对象转换的原因是目标对象可以已经实例化,并且有一些属性拥有初值,而且在转换过程中,源对象不会对这些属性有干扰。而如果直接可以由源对象生成目标对象的情况,直接使用类转换(Class<T> c)即可。
b.xml配置的转换。
因为有些时候需要转换的两个对象之间字段可能不一致,但却是对应的。这时候需要用xml来指定源对象的哪个属性对应目标对象的哪个属性,好进行转换。
xml配置的mapper:
private static Mapper xmlMapper;
public static Mapper getMapperInstanceByXML(){
if(xmlMapper==null){
List<String> files = new ArrayList<String>();
files.add("dozer.xml");
xmlMapper = new DozerBeanMapper(files);
}
return xmlMapper;
}
同样转换方法有两种:
/**
* xml bean转换
* @param objs
* @param objt
* @return
*/
public static Object ConvertByXML(Object objs, Object objt){
if(objs!=null&&objt!=null){
Mapper mapper = getMapperInstanceByXML();
mapper.map(objs, objt);
return objt;
}
return null;
}
/**
* xml bean转换
* @param objs
* @param c
* @return
*/
public static <T> T ConvertByXML(Object objs, Class<T> c){
if(objs!=null&&c!=null){
Mapper mapper = getMapperInstanceByXML();
return mapper.map(objs, c);
}
return null;
}
对于第二种xml配置的方式,附上一份简单的模版:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mappings PUBLIC "-//DOZER//DTD MAPPINGS//EN"
"src/main/resources/conf/dozerbeanmapping.dtd">
<mappings>
<!-- config rules -->
<configuration>
<stop-on-errors>false</stop-on-errors>
<date-format>yyyy-MM-dd HH:mm</date-format>
<wildcard>true</wildcard>
</configuration>
<!-- Bean mapping for converting -->
<mapping>
<!-- source -->
<class-a>com.test.sourceTest</class-a>
<!-- destination -->
<class-b>com.test.destinationTest</class-b>
<!-- field -->
<field>
<a>name</a>
<b>changeName</b>
</field>
<field>
<a>date</a>
<b>dateStr</b>
</field>
</mapping>
</mappings>
首先,该配置文件需要dtd文件:
dozerbeanmapping.dtd
此xml告诉dozer工具sourceTest类的name和date分别对应destination类的changeName和dateStr;转换过程中会直接对应转换。
而且在sourceTest类中的date属性为Date对象,由于
<date-format>yyyy-MM-dd HH:mm</date-format>
的原因,会转换成destination类中的相应格式的String类型dateStr。怎样,dozer够强大吧!
由于时间有限,还未做更深入的学习。等下来深入学习后再分享交流吧。