http://seyaa.iteye.com/blog/762494

1.1 什么是dozer?
Dozer 是一个对象转换工具。
Dozer可以在JavaBean到JavaBean之间进行递归数据复制,并且这些JavaBean可以是不同的复杂的类型。
所有的mapping,Dozer将会很直接的将名称相同的fields进行复制,如果field名不同,或者有特别的对应要求,则可以在xml中进行定义。
更多详细请参考dozer官网:http://dozer.sourceforge.net/documentation/about.html
1.2 为什么要使用Dozer?
分析多层架构的J2EE系统,经常存在JavaBean直接的拷贝。比如我们在DAO层,通过Do取得业务层需要的数据,将这些数据传递给 Service层的VO。Do与VO就存在典型的值拷贝。
典型的解决方案就是手动拷贝,弊端很明显,代码中充斥大量Set 和Get方法,真正的业务被埋藏值与值的拷贝之中。另一种方案就是使用BeanUtil,但BeanUtil不够很好的灵活性,又时候还不得不手动拷贝。Dozer可以灵活的对对象进行转换,且使用简单。

注意:Dozer支持简单类型 复杂类型的双向递归映射。
1.3 如何得到Dozer 工具类jar包
1.点击下载:http://sourceforge.net/projects/dozer/files/

2.如果使用maven工具的话,在pom.Xml文件中加入:

Java代码  
  1. <dependency>
  2. <groupId>net.sf.dozer</groupId>
  3. <artifactId>dozer</artifactId>
  4. <version>5.2.1</version>
  5. </dependency>
<dependency>
<groupId>net.sf.dozer</groupId>
<artifactId>dozer</artifactId>
<version>5.2.1</version>
</dependency>

加入你的构建路径既可以使用。
2 Dozer 支持的转换类型
Dozer支持
Primitive 基本数据类型 , 后面带 Wrapper 是包装类 Complex Type 是复杂类型
• Primitive to Primitive Wrapper
• Primitive to Custom Wrapper
• Primitive Wrapper to Primitive Wrapper
• Primitive to Primitive
• Complex Type to Complex Type
• String to Primitive
• String to Primitive Wrapper
• String to Complex Type if the Complex Type contains a String constructor
• String 到复杂类型 , 如果复杂类型包含一个 String 类型的构造器
• String to Map
• Collection to Collection
• Collection to Array
• Map to Complex Type
• Map to Custom Map Type
• Enum to Enum
• Each of these can be mapped to one another: java.util.Date, java.sql.Date, java.sql.Time, java.sql.Timestamp, java.util.Calendar, java.util.GregorianCalendar
• String to any of the supported Date/Calendar Objects.
• Objects containing a toString() method that produces a long representing time in (ms) to any supported Date/Calendar object.
3 Dozer使用(不与spring集成下)
3.1 dozer使用分类
根据有无映射文件和文件的多少,有三种方式:
第一种:该方式用于数据类型为基本类型,名称相同的对象映射

Java代码  
  1. Mapper mapper = new DozerBeanMapper();
  2. SourceObject sourceObject = new SourceObject();
  3. DestinationObject destObject = (DestinationObject) mapper.map(sourceObject, DestinationObject.class);
  4. //  or
  5. DestinationObject destObject = new DestinationObject();
  6. mapper.map(sourceObject, destObject);
Mapper mapper = new DozerBeanMapper();
SourceObject sourceObject = new SourceObject();
DestinationObject destObject = (DestinationObject) mapper.map(sourceObject, DestinationObject.class);
//  or
DestinationObject destObject = new DestinationObject();
mapper.map(sourceObject, destObject);

第二种:该方式用于数据类型不一致,或者名称不相同或者有级联关系等情况下的映射,该方式可以添加多个配置文件dozerBeanMapping.xml、someOtherDozerBeanMappings.xml 等

Java代码  
  1. List myMappingFiles = new ArrayList();
  2. myMappingFiles.add("dozerBeanMapping.xml");
  3. //myMappingFiles.add("someOtherDozerBeanMappings.xml");
  4. DozerBeanMapper mapper = new DozerBeanMapper();
  5. SourceObject sourceObject = new SourceObject();
  6. mapper.setMappingFiles(myMappingFiles);
  7. DestinationObject stObject=
  8. (DestinationObject) mapper.map(sourceObject, DestinationObject.class);
List myMappingFiles = new ArrayList();
myMappingFiles.add("dozerBeanMapping.xml");
//myMappingFiles.add("someOtherDozerBeanMappings.xml");
DozerBeanMapper mapper = new DozerBeanMapper();
SourceObject sourceObject = new SourceObject();
mapper.setMappingFiles(myMappingFiles);
DestinationObject stObject=
(DestinationObject) mapper.map(sourceObject, DestinationObject.class);

第三种:该方式用于数据类型不一致,或者名称不相同或者有级联关系等情况下的映射,配置文件只有一个映射文件叫dozerBeanMapping.xml且在根目录下

Java代码  
  1. Mapper mapper = DozerBeanMapperSingletonWrapper.getInstance();
  2. SourceObject sourceObject = new SourceObject();
  3. DestinationObject destObject = (DestinationObject) mapper.map(sourceObject, DestinationObject.class);
  4. //or
  5. //Mapper mapper = DozerBeanMapperSingletonWrapper.getInstance();
  6. //DestinationObject destObject = new DestinationObject();
  7. mapper.map(sourceObject, destObject);
Mapper mapper = DozerBeanMapperSingletonWrapper.getInstance();
SourceObject sourceObject = new SourceObject();
DestinationObject destObject = (DestinationObject) mapper.map(sourceObject, DestinationObject.class);
//or
//Mapper mapper = DozerBeanMapperSingletonWrapper.getInstance();
//DestinationObject destObject = new DestinationObject();
mapper.map(sourceObject, destObject);

3.2 举例说明:
假设我们现在有一个userDo类,如下:

Java代码  
  1. package ce.dozer;
  2. public class User {
  3. private int id;
  4. private String name;
  5. private String password;
  6. private Info info;
  7. public int getId() {
  8. return id;
  9. }
  10. public void setId(int id) {
  11. this.id = id;
  12. }
  13. public String getName() {
  14. return name;
  15. }
  16. public void setName(String name) {
  17. this.name = name;
  18. }
  19. public String getPassword() {
  20. return password;
  21. }
  22. public void setPassword(String password) {
  23. this.password = password;
  24. }
  25. public Info getInfo() {
  26. return info;
  27. }
  28. public void setInfo(Info info) {
  29. this.info = info;
  30. }
  31. }
package ce.dozer;
public class User {
private int id;
private String name;
private String password;
private Info info;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Info getInfo() {
return info;
}
public void setInfo(Info info) {
this.info = info;
}
}

一个userVo类,如下:

Java代码  
  1. package ce.dozer;
  2. public class UserVO {
  3. private int id;
  4. private String userName;
  5. private String password;
  6. private InfoVO info;
  7. public int getId() {
  8. return id;
  9. }
  10. public void setId(int id) {
  11. this.id = id;
  12. }
  13. public String getUserName() {
  14. return userName;
  15. }
  16. public void setUserName(String userName) {
  17. this.userName = userName;
  18. }
  19. public String getPassword() {
  20. return password;
  21. }
  22. public void setPassword(String password) {
  23. this.password = password;
  24. }
  25. public InfoVO getInfo() {
  26. return info;
  27. }
  28. public void setInfo(InfoVO info) {
  29. this.info = info;
  30. }
  31. }
package ce.dozer;
public class UserVO {
private int id;
private String userName;
private String password;
private InfoVO info;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public InfoVO getInfo() {
return info;
}
public void setInfo(InfoVO info) {
this.info = info;
}
}

一个性別枚舉类,如下:

Java代码  
  1. package ce.dozer;
  2. public enum GenderType {
  3. male,//男
  4. female//女
  5. }
package ce.dozer;
public enum GenderType {
male,//男
female//女
}

一个infoDo类,如下:

Java代码  
  1. package ce.dozer;
  2. import java.util.Date;
  3. public class Info {
  4. private int id;
  5. private Date createDate;
  6. private GenderType gender;
  7. public int getId() {
  8. return id;
  9. }
  10. public void setId(int id) {
  11. this.id = id;
  12. }
  13. public Date getCreateDate() {
  14. return createDate;
  15. }
  16. public void setCreateDate(Date createDate) {
  17. this.createDate = createDate;
  18. }
  19. public GenderType getGender() {
  20. return gender;
  21. }
  22. public void setGender(GenderType gender) {
  23. this.gender = gender;
  24. }
  25. }
package ce.dozer;
import java.util.Date;
public class Info {
private int id;
private Date createDate;
private GenderType gender;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public Date getCreateDate() {
return createDate;
}
public void setCreateDate(Date createDate) {
this.createDate = createDate;
}
public GenderType getGender() {
return gender;
}
public void setGender(GenderType gender) {
this.gender = gender;
}
}

一个infoVo类,如下:

Java代码  
  1. package ce.dozer;
  2. public class InfoVO {
  3. private int id;
  4. private String date;
  5. private Integer gender;
  6. public int getId() {
  7. return id;
  8. }
  9. public void setId(int id) {
  10. this.id = id;
  11. }
  12. public String getDate() {
  13. return date;
  14. }
  15. public void setDate(String date) {
  16. this.date = date;
  17. }
  18. public Integer getGender() {
  19. return gender;
  20. }
  21. public void setGender(Integer gender) {
  22. this.gender = gender;
  23. }
  24. }
package ce.dozer;
public class InfoVO {
private int id;
private String date;
private Integer gender;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getDate() {
return date;
}
public void setDate(String date) {
this.date = date;
}
public Integer getGender() {
return gender;
}
public void setGender(Integer gender) {
this.gender = gender;
}
}

在给出的示例中我们可以看到userDo与 userVo 中的字段对应关系
userVo userDo 不同
id(int) id(int)
userName(String) name(String) 名称不同
password(String) password(String)
Info(InfoVo) info (Info) 类型不同
再看看infoDo与 infoVo 中的字段对应关系
infoVo infoDo 不同
id(int) Id(int)
createDate(String) date(Date) 类型不同
gender(Integer) Gender(GenderType)枚举 类型不同
综合上面的问题我们可以如下解决方式:

3.2.1 字段名称不同映射配置

Java代码  
  1. <mapping>
  2. <class-a>ce.dozer.User</class-a>
  3. <class-b>ce.dozer.UserVO</class-b>
  4. <field>
  5. <a>name</a>
  6. <b>userName</b>
  7. </field>
  8. </mapping>
<mapping>
<class-a>ce.dozer.User</class-a>
<class-b>ce.dozer.UserVO</class-b>
<field>
<a>name</a>
<b>userName</b>
</field>
</mapping>

3.2.2 Date与String映射配置如下:

Java代码  
  1. <mapping date-format="yyyy-MM-dd">
  2. <class-a>ce.dozer.User</class-a>
  3. <class-b>ce.dozer.UserVO</class-b>
  4. <field>
  5. <a>info.createDate</a>
  6. <b>info.date</b>
  7. </field>
  8. </mapping>
<mapping date-format="yyyy-MM-dd">
<class-a>ce.dozer.User</class-a>
<class-b>ce.dozer.UserVO</class-b>
<field>
<a>info.createDate</a>
<b>info.date</b>
</field>
</mapping>

3.2.3 在示例中我们看到在userDo和userVo对象中关联了其他的对象,这个问题不用担心,因为对象名称相同dozer会为我们自动转换。而问题不在这,在与对象中有枚举类型,我们该怎么写配置呢?在这里我们就必须自己编写一个处理类来处理枚举与Integer的转换了(假设我们的处理类为util.EnumIntConverter),配置如下:

Java代码  
  1. <configuration>
  2. <stop-on-errors>true</stop-on-errors>
  3. <date-format>yyyy-MM-dd</date-format>
  4. <wildcard>true</wildcard>
  5. <custom-converters>
  6. <converter type=" util.EnumIntConverter">
  7. <class-a>java.lang.Enum</class-a>
  8. <class-b>java.lang.Integer</class-b>
  9. </converter>
  10. </custom-converters>
  11. </configuration>
  12. <mapping>
  13. <class-a>ce.dozer.User</class-a>
  14. <class-b>ce.dozer.UserVO</class-b>
  15. <field>
  16. <a>info.gender</a>
  17. <b>info.gender</b>
  18. </field>
  19. </mapping>
<configuration>
<stop-on-errors>true</stop-on-errors>
<date-format>yyyy-MM-dd</date-format>
<wildcard>true</wildcard>
<custom-converters>
<converter type=" util.EnumIntConverter">
<class-a>java.lang.Enum</class-a>
<class-b>java.lang.Integer</class-b>
</converter>
</custom-converters>
</configuration>
<mapping>
<class-a>ce.dozer.User</class-a>
<class-b>ce.dozer.UserVO</class-b>
<field>
<a>info.gender</a>
<b>info.gender</b>
</field>
</mapping>

最终的dozerBeanMapping.xml 配置文件:

Java代码  
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <mappings xmlns="http://dozer.sourceforge.net" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://dozer.sourceforge.net
  4. http://dozer.sourceforge.net/schema/beanmapping.xsd">
  5. <configuration>
  6. <stop-on-errors>true</stop-on-errors>
  7. <date-format>yyyy-MM-dd</date-format>
  8. <wildcard>true</wildcard>
  9. <custom-converters>
  10. <converter type=" util.EnumIntConverter">
  11. <class-a>java.lang.Enum</class-a>
  12. <class-b>java.lang.Integer</class-b>
  13. </converter>
  14. </custom-converters>
  15. </configuration>
  16. <mapping date-format="yyyy-MM-dd">
  17. <class-a>ce.dozer.User</class-a>
  18. <class-b>ce.dozer.UserVO</class-b>
  19. <field>
  20. <a>info.createDate</a>
  21. <b>info.date</b>
  22. </field>
  23. <field>
  24. <a>info.gender</a>
  25. <b>info.gender</b>
  26. </field>
  27. <field>
  28. <a>info.createDate</a>
  29. <b>info.date</b>
  30. </field>
  31. <field>
  32. <a>name</a>
  33. <b>userName</b>
  34. </field>
  35. </mapping>
  36. </mappings>
<?xml version="1.0" encoding="UTF-8"?>
<mappings xmlns="http://dozer.sourceforge.net" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://dozer.sourceforge.net
http://dozer.sourceforge.net/schema/beanmapping.xsd">
<configuration>
<stop-on-errors>true</stop-on-errors>
<date-format>yyyy-MM-dd</date-format>
<wildcard>true</wildcard>
<custom-converters>
<converter type=" util.EnumIntConverter">
<class-a>java.lang.Enum</class-a>
<class-b>java.lang.Integer</class-b>
</converter>
</custom-converters>
</configuration>
<mapping date-format="yyyy-MM-dd">
<class-a>ce.dozer.User</class-a>
<class-b>ce.dozer.UserVO</class-b>
<field>
<a>info.createDate</a>
<b>info.date</b>
</field>
<field>
<a>info.gender</a>
<b>info.gender</b>
</field>
<field>
<a>info.createDate</a>
<b>info.date</b>
</field>
<field>
<a>name</a>
<b>userName</b>
</field>
</mapping>
</mappings>

4 与spring的集成
4.1 1、dozer 要与spring集成需要将dozer交给spring管理,配置如下:

Xml代码  
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:tx="http://www.springframework.org/schema/tx"
  5. xmlns:aop="http://www.springframework.org/schema/aop"
  6. xsi:schemaLocation="
  7. http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
  8. http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd
  9. http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd"
  10. default-autowire="byName" default-lazy-init="false">
  11. <bean id="mapper" class="org.dozer.spring.DozerBeanMapperFactoryBean">
  12. <property name="mappingFiles">
  13. <list>             <value>classpath*:dozer-config/dozerBeanMapping.xml</value>
  14. </list>
  15. </property>
  16. </bean>
  17. </beans>
<?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:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd"
default-autowire="byName" default-lazy-init="false">
<bean id="mapper" class="org.dozer.spring.DozerBeanMapperFactoryBean">
<property name="mappingFiles">
<list>             <value>classpath*:dozer-config/dozerBeanMapping.xml</value>
</list>
</property>
</bean>
</beans> 

4.2 2、当我们的dozer交给了spring管理,当spring容器启动后我们可以将下面的代码添加到用于继承的基类中去:

Java代码  
  1. private Mapper mapper ;
  2. public Mapper getMapper() {
  3. return mapper;
  4. }
  5. public void setMapper(Mapper mapper) {
  6. this.mapper = mapper;
  7. }
  8. 4.3 3、在继承者类中就可以直接如下使用:
  9. getMapper().map(sourceObject, DestinationObject.class)
private Mapper mapper ;
public Mapper getMapper() {
return mapper;
}
public void setMapper(Mapper mapper) {
this.mapper = mapper;
}
4.3 3、在继承者类中就可以直接如下使用:
getMapper().map(sourceObject, DestinationObject.class)

5 结束语
Dozer的转换功能很强大,我们所能想到的类型转换,它基本都可以帮助我们完成。所以如果您想对dozer了解更多更深,建议到官网仔细阅读相关文档和说明!
官网:http://dozer.sourceforge.net/documentation/mappings.html

  • 示例代码.rar (1.9 KB)
  • 下载次数: 57

Dozer 使用总结相关推荐

  1. java反射po转vo_三步走使用Dozer (Do,Po,Vo转换工具)

    第一步 把依赖加上 com.github.dozermapper dozer-core 6.5.0 第二步,不同属性名的在被转换bean上(Do)注解@Mapping("vo里该字段名称&q ...

  2. jaxb和dozer简介

    一.jaxb是什么      JAXB是Java Architecture for XML Binding的缩写.可以将一个Java对象转变成为XML格式,反之亦然.      我们把对象与关系数据库 ...

  3. java dozer 深度_java – Dozer深度映射设置为Set

    免责声明: Mapping deep properties with intermediate collections in dozer已经提出了同样的问题,但没有接受答案(我的案例没有正确答案). ...

  4. dozer bean_使用Dozer框架进行Bean操作

    dozer bean 介绍 如您所知,您可以在任何操作系统中将文件或文件夹从源位置复制到目标位置. 您是否考虑过复制基本上是POJO的java对象? 在很多情况下,您需要将源bean的内容复制到目标b ...

  5. 使用Dozer框架进行Bean操作

    介绍 如您所知,您可以在任何操作系统中将文件或文件夹从源位置复制到目标位置. 您是否考虑过复制基本上是POJO的java对象? 在许多情况下,您需要将源bean的内容复制到目标bean. 我不关心对象 ...

  6. java dozer map转对象_对象转换利器之Dozer

    在Java的世界中,经常会涉及到需要在2个对象中进行转换,比如说: 调用SOAP Web服务,需要把自己的Domain对象转换为Soap服务的Jaxb对象请求, 在分层级SOA架构中,2个层级之间Do ...

  7. 使用了Spring boot devtools, dozer转换嵌套对象失败解决记录

    2019独角兽企业重金招聘Python工程师标准>>> 业务背景: 添加商品以及价格,一个商品会有多个价格(针对不同用户等级). 代码: 先在controller中使用dozer将g ...

  8. dozer无法映射java8中的LocalDateTime类型的解决方案

    dozer是一个很方便的bean映射工具包,可以很轻松地做到两个bean对象的属性值复制,但是dozer包在2014年的时候停止更新了,而jdk1.8也是2014年发布的,所以对于java8中的新日期 ...

  9. java dozer,MapStruct相当于提示(Dozer)?

    在Dozer中,我们能够在字段映射期间提示提示中的接口 . 我们如何在MapStruct中实现相同的目标? 我无法在这里输入确切的代码 . 但是,它与下面类似 . 我们这里有一个Domain类示例: ...

最新文章

  1. docker添加新的环境变量_Docker的安装及部署Spring Boot项目操作详解!
  2. python psycopg2使用_Python中用psycopg2模块操作PostgreSQL方法
  3. 光通量发光强度照度亮度关系_技术丨LED电子显示屏真实的亮度指数鉴别
  4. 天翼网关3.0说明书_天翼网关3.0(tewa-708g)续
  5. swoole php 微信推送,基于thinkphp5、swoole和easywechat微信模板消息推送
  6. 一个顶N个的NextResult
  7. windos读写ext3工具_“ ext2fsd” Windows系统工具,用于读写ext2 / 3/4文件系统
  8. arduino 土壤温湿度传感器_arduino测量土壤湿度自动浇水提醒 - 全文
  9. PWM原理 PWM频率与占空比详解
  10. 11讲项目实战首页右侧悬浮框及内页面包屑导航
  11. Linux程序设计——用getopt处理命令行参数
  12. USACO3.2.4 Feed Ratios (ratios)
  13. 涉密计算机默认安全用户名,机密级涉密计算机的系统登录如采用用户名加口令的方式,则系统口令更换周期不得长于 - 作业在线问答...
  14. android rom 寿命,LineageOS ROM 彻底放弃安卓 9 Pie,华为P20 Pro/小米5s等24款手机不再更新...
  15. ubuntu 运行c语言文件路径,ubuntu上解压目录里的文件到指定文件夹
  16. 中文汉字注音,汉字转拼音,支持图片识别文字,支持结果转图下载,附上小程序核心源码
  17. 银河大百科【宇宙的数量级】
  18. 基于h5 canvas的模拟时钟javascript程序
  19. #VCS# 关于Verdi KDB 数据库
  20. H264编码器13(CAVLC和CABAC简介)

热门文章

  1. JavaScript禁用鼠标右键菜单
  2. 5.Vue 计算属性和侦听器
  3. 和程序员在一起是怎样的体验
  4. Java常用API(五)Math 数学类
  5. 【机器视觉】 HDevelop语言基础(六)-错误处理
  6. 【Tools】Modbus Slave 7安装详解
  7. 【MFC】MFC对话框类
  8. 【STM32】外部中断
  9. 【Java】Java枚举类型示例
  10. java 写文件 0x0d_Java 读写文件 - My and My Princess…… - OSCHINA - 中文开源技术交流社区...