准确的说,是因为pojo无法一招走天下或者说内外部隔离的原因,所以有些时候,不得不在两个bean之间做copy或者转换映射。对于直接性的属性拷贝beanutil以及能够满足大部分要求,但是如果遇到字段不一致或者需要二次处理的情况下,就需要进行人工代码处理了。而且这些重复除非通过某种方式管理起来,不然系统中会有大量的复制粘贴。

周六的时候,一个同事说他们那边使用的dozer,还挺好用的,于是看了下官方手册http://dozer.sourceforge.net/dozer-user-guide.pdf,确实比较灵活,有点类似于mybatis之余jdbc原生代码。DEMO示例(实际使用中建议使用spring IOC方式,以及classpath加载,故非以教程式,而是直接可用的代码为例子)如下。

原bean:

package test;

public class SourceObject {
private String srcName;
private int age;
private String notMatch;
public String getSrcName() {
return srcName;
}
public void setSrcName(String srcName) {
this.srcName = srcName;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getNotMatch() {
return notMatch;
}
public void setNotMatch(String notMatch) {
this.notMatch = notMatch;
}
}

目标bean:

package test;

public class DestinationObject {
private String destName;
private int age;
private String notExist;
private String dictName;
public String getDestName() {
return destName;
}
public void setDestName(String destName) {
this.destName = destName;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getNotExist() {
return notExist;
}
public void setNotExist(String notExist) {
this.notExist = notExist;
}
public String getDictName() {
return dictName;
}
public void setDictName(String dictName) {
this.dictName = dictName;
} public void dictSet(String destName) {
this.dictName = "dict " + destName;
}
}

转换映射文件:

<?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>MM/dd/yyyy HH:mm</date-format> <!-- 设置java.util.Date的默认格式, 用于 -->
<wildcard>true</wildcard>
</configuration> <mapping>
<class-a>test.SourceObject</class-a>
<class-b>test.DestinationObject</class-b>
<field>
<a>srcName</a>
<b>destName</b>
</field>
<field>
<a>srcName</a> <!-- 一个属性可以映射到多个目标 -->
<b set-method="dictSet">dictName</b> <!-- 会将destName作为参数传递给dictSet方法 -->
</field>
</mapping>
<!-- other custom class mappings would go here....... --> </mappings>

spring配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.0.xsd"
default-autowire="byName"
default-lazy-init="false"> <bean id="mapper" class="org.dozer.spring.DozerBeanMapperFactoryBean">
<property name="mappingFiles">
<list>
<value>classpath*:*DTOMapper.xml</value>
</list>
</property>
</bean>
</beans>

测试类:

package test;

import org.dozer.DozerBeanMapper;
import org.dozer.Mapper;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.transaction.TransactionConfiguration; import com.alibaba.fastjson.JSON; @RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:spring-dozer.xml"})
@TransactionConfiguration(defaultRollback = false)
public class DozerBeanMapperTest {
@Autowired
Mapper mapperNotDefault; @Test
public void testDozerBeanMapper(){
SourceObject sourceObject = new SourceObject();
sourceObject.setAge(1);
sourceObject.setNotMatch("notmatch");
sourceObject.setSrcName("name1");
DestinationObject destObject;
Mapper mapper = new DozerBeanMapper();
destObject = mapper.map(sourceObject, DestinationObject.class);
System.out.println(JSON.toJSONString(sourceObject));
System.out.println(JSON.toJSONString(destObject)); destObject = mapperNotDefault.map(sourceObject, DestinationObject.class);
System.out.println(JSON.toJSONString(sourceObject));
System.out.println(JSON.toJSONString(destObject));
}
}

输出如下:

{"age":1,"notMatch":"notmatch","srcName":"name1"}
{"age":1}
{"age":1,"notMatch":"notmatch","srcName":"name1"}
{"age":1,"destName":"name1","dictName":"dict name1"}

比beanutil更加灵活的dto转换工具dozer的更多相关文章

  1. .NET的DTO映射工具AutoMapper

    .NET的DTO映射工具AutoMapper 原文:https://github.com/AutoMapper/AutoMapper/wiki/Getting-started 参考:http://ww ...

  2. 对象转换工具 MapStruct 介绍

    前言 在我们日常开发的分层结构的应用程序中,为了各层之间互相解耦,一般都会定义不同的对象用来在不同层之间传递数据,因此,就有了各种 XXXDTO.XXXVO.XXXBO 等基于数据库对象派生出来的对象 ...

  3. Unicode编码解码在线转换工具

    // Unicode编码解码在线转换工具 Unicode 是基于通用字符集(Universal Character Set)的标准来发展,并且同时也以书本的形式(The Unicode Standar ...

  4. android px,dp,sp大小转换工具

    package com.voole.playerlib.util; import android.content.Context; /** * Android大小单位转换工具类<br/> ...

  5. Json与javaBean之间的转换工具类

    /**  * Json与javaBean之间的转换工具类  *  * {@code 现使用json-lib组件实现  *    需要  *     json-lib-2.4-jdk15.jar  * ...

  6. Rsa加解密Java、C#、php通用代码 密钥转换工具

    之前发了一篇"TripleDes的加解密Java.C#.php通用代码",后面又有项目用到了Rsa加解密,还是在不同系统之间进行交互,Rsa在不同语言的密钥格式不一样,所以过程中主 ...

  7. ubuntu下编码转换工具

    ubuntu打开windows下的txt或者代码文件,经常会出现乱码, ubuntu自带一种转换工具,是命令行的,下面提供一种最简单的方法进行转换 比如要转换的文件为1.txt,进入1.txt的目录 ...

  8. 日期转换工具类 CommUtil.java

    package com.util; import java.text.ParseException; import java.text.SimpleDateFormat; import java.ut ...

  9. 视频转换工具 Transmageddon

    点这里 Transmageddon 是一个采用 Python 语言开发的视频转换工具,支持输出几乎所有的视频格式,同时也可以生成指定平台下的视频格式. 软件界面如下图所示

随机推荐

  1. 解决bug感觉

    解决bug,没有思路,很烦躁: 时间过去好久,还是没头绪,没结论: ...... ...... ...... ...... ...... 过了好久,这样还不如冷静下来,按照正确的方法(review代码 ...

  2. 引:Jmeter添加变量的四种方法

    一.在样本中添加同请求一起发送的参数.根据服务器设置的数据类型,来添加不同类型的参数 二.用户定义的变量 1.创建:添加->配置元件->用户定义的变量 2.作用:当前的线程组内所有Samp ...

  3. keras 分类回归 损失函数与评价指标

    1.目标函数 (1)mean_squared_error / mse 均方误差,常用的目标函数,公式为((y_pred-y_true)**2).mean()(2)mean_absolute_error ...

  4. SEO--提高权重

    搜索引擎提交入口:将新网站提交收录 SEO优化三要素:标题 关键词 描述 外链(友情链接) 目的:提高权重 注意事项: 1.和内容相近的网站交换 2.链接交换形式多样 单向链接:别人指向我或我指向别人 ...

  5. 惠普开源的通信测试工具Seagull的安装体会

    1. 为省事起见,先下载安装包,发现依赖库版本太低,没法运行.于是源码编译安装.主要参考:https://github.com/codeghar/Seagull,似乎http://gull.sourc ...

  6. python开源数据库gadfly安装排除错误

    从sourceforge.net上下载的,结果需要仔细看网页才能找到下载地址.下载zip包,它没有把下载地址放在显眼的地方. 安照提示,python setup.py结果提示出错.看帮助文件,需要运行 ...

  7. JavaScriptSerializer的日期转换方案

    1.转换后过滤替换(通用) /// <summary> /// 日期转换 /// </summary> /// <param name="str"&g ...

  8. Selenium基本使用(十三)测试中常见问题

    我们在使用selenium测试过程中,经常会遇到这样的问题: 1.frame或iframe <iframe id='frame1' name='frame1'> <input typ ...

  9. 47.HTML---frame,iframe,frameset之间的关系与区别

    iframe 是在html页面内嵌入框架 框架内可以连接另一个页面, 如 <html> <head></head> <body> <iframe ...

  10. 通过Response下载。

    之前一直在找js下载的插件,后来发现下载必须通过java后台处理,什么write(),open(),close()之类的方法.如果直接是通过<a>标签倒是简单的,直接将路径摆放在上面就可以 ...