`
zhuchengzzcc
  • 浏览: 440409 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Dozer小试

    博客分类:
  • java
阅读更多

 

一、简介

       分析多层架构的JEE系统,经常存在JavaBean直接的拷贝,典型的解决方案就是手动拷贝,弊端很明显,代码中充斥大量Set Get方法,真正的业务没埋藏与值的拷贝之中.另一种方案就是使用BeanUtil,但BeanUtil不够很好的灵活性,又时候还不得不手动拷贝。

       Dozer提供了一种非常好的解决方案。

       Dozer 是一个对象转换工具。 Dozer可以在JavaBean到JavaBean之间进行递归数据复制,并且这些JavaBean可以是不同的复杂的类型。 所有的mapping,Dozer将会很直接的将名称相同的fields进行复制,如果field名不同,或者有特别的对应要求,则可以在xml中进行定义。 更多详细请参考dozer官网:http://dozer.sourceforge.net/documentation/about.html

 

二、下载

       1、http://sourceforge.net/projects/dozer/files/

       2、在maven中,pom文中加入:

 

<dependency>
	<groupId>net.sf.dozer</groupId>
	<artifactId>dozer</artifactId>
	<version>5.4.0</version>
</dependency>

 

三、示例

      po Book类

package dozer;

import java.util.Date;

/**
 * @author zhuc
 * @create 2013-3-28 下午1:57:50
 */
public class Book {

	private Integer id;

	private String name;

	private String author;

	private String capacity;

	private Date birthday;

	private String bookTypeName;

	private Integer source;

	/**
	 * @return the name
	 */
	public String getName() {
		return name;
	}

	/**
	 * @return the author
	 */
	public String getAuthor() {
		return author;
	}

	/**
	 * @param name the name to set
	 */
	public void setName(String name) {
		this.name = name;
	}

	/**
	 * @param author the author to set
	 */
	public void setAuthor(String author) {
		this.author = author;
	}

	/**
	 * @return the capacity
	 */
	public String getCapacity() {
		return capacity;
	}

	/**
	 * @param capacity the capacity to set
	 */
	public void setCapacity(String capacity) {
		this.capacity = capacity;
	}

	/**
	 * @return the id
	 */
	public Integer getId() {
		return id;
	}

	/**
	 * @param id the id to set
	 */
	public void setId(Integer id) {
		this.id = id;
	}

	/**
	 * @return the birthday
	 */
	public Date getBirthday() {
		return birthday;
	}

	/**
	 * @param birthday the birthday to set
	 */
	public void setBirthday(Date birthday) {
		this.birthday = birthday;
	}

	/**
	 * @return the bookTypeName
	 */
	public String getBookTypeName() {
		return bookTypeName;
	}

	/**
	 * @param bookTypeName the bookTypeName to set
	 */
	public void setBookTypeName(String bookTypeName) {
		this.bookTypeName = bookTypeName;
	}

	/**
	 * @return the source
	 */
	public Integer getSource() {
		return source;
	}

	/**
	 * @param source the source to set
	 */
	public void setSource(Integer source) {
		this.source = source;
	}

	/* (non-Javadoc)
	 * @see java.lang.Object#toString()
	 */
	@Override
	public String toString() {
		return "Book [id=" + id + ", name=" + name + ", author=" + author + ", capacity=" + capacity + ", birthday="
				+ birthday + ", bookTypeName=" + bookTypeName + ", source=" + source + "]";
	}

}

 

      vo BookVo类

package dozer;

/**
 * @author zhuc
 * @create 2013-3-28 下午1:58:34
 */
public class BookVo {

	private Integer id;

	private String nameVo;

	private String authorVo;

	private Integer capacity;

	private String day;

	private BookType bookType;

	private String source;

	/**
	 * @return the nameVo
	 */
	public String getNameVo() {
		return nameVo;
	}

	/**
	 * @return the authorVo
	 */
	public String getAuthorVo() {
		return authorVo;
	}

	/**
	 * @param nameVo the nameVo to set
	 */
	public void setNameVo(String nameVo) {
		this.nameVo = nameVo;
	}

	/**
	 * @param authorVo the authorVo to set
	 */
	public void setAuthorVo(String authorVo) {
		this.authorVo = authorVo;
	}

	/**
	 * @return the capacity
	 */
	public Integer getCapacity() {
		return capacity;
	}

	/**
	 * @param capacity the capacity to set
	 */
	public void setCapacity(Integer capacity) {
		this.capacity = capacity;
	}

	/**
	 * @return the id
	 */
	public Integer getId() {
		return id;
	}

	/**
	 * @param id the id to set
	 */
	public void setId(Integer id) {
		this.id = id;
	}

	/**
	 * @return the day
	 */
	public String getDay() {
		return day;
	}

	/**
	 * @param day the day to set
	 */
	public void setDay(String day) {
		this.day = day;
	}

	/**
	 * @return the bookType
	 */
	public BookType getBookType() {
		return bookType;
	}

	/**
	 * @param bookType the bookType to set
	 */
	public void setBookType(BookType bookType) {
		this.bookType = bookType;
	}

	/**
	 * @return the source
	 */
	public String getSource() {
		return source;
	}

	/**
	 * @param source the source to set
	 */
	public void setSource(String source) {
		this.source = source;
	}

	/* (non-Javadoc)
	 * @see java.lang.Object#toString()
	 */
	@Override
	public String toString() {
		return "BookVo [id=" + id + ", nameVo=" + nameVo + ", authorVo=" + authorVo + ", capacity=" + capacity
				+ ", day=" + day + ", bookType=" + bookType + ", source=" + source + "]";
	}

}

 

其中vo中包含复杂对象BookType类

 

package dozer;

/**
 * @author zhuc
 * @create 2013-3-28 下午2:43:16
 */
public class BookType {

	private String name;

	private String desc;

	/**
	 * @return the name
	 */
	public String getName() {
		return name;
	}

	/**
	 * @return the desc
	 */
	public String getDesc() {
		return desc;
	}

	/**
	 * @param name the name to set
	 */
	public void setName(String name) {
		this.name = name;
	}

	/**
	 * @param desc the desc to set
	 */
	public void setDesc(String desc) {
		this.desc = desc;
	}

	/* (non-Javadoc)
	 * @see java.lang.Object#toString()
	 */
	@Override
	public String toString() {
		return "BookType [name=" + name + ", desc=" + desc + "]";
	}

}

 

这里在复制对象,我们发现有类型不一致、名称不一样或者都不一样的需要自定义映射的字段等,我们需要自定义mapping.xml 映射文件。

 

<?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">
	
	<mapping date-format="yyyy-MM-dd HH:mm:ss">
		<class-a>dozer.Book</class-a>
		<class-b>dozer.BookVo</class-b>
		<field>
			<a>name</a>
			<b>nameVo</b>
		</field>
		<field>
			<a>author</a>
			<b>authorVo</b>
		</field>
		<field>
			<a>birthday</a>
			<b>day</b>
		</field>
		<field>
			<a>bookTypeName</a>
			<b>bookType.name</b>
		</field>
		<field custom-converter="dozer.MyCustomConverter">
			<a>source</a>
			<b>source</b>
		</field>
	</mapping>
	
</mappings>

 

 

package dozer;

import org.dozer.CustomConverter;

/**
 * 自定义转换类
 * @author zhuc
 * @create 2013-3-28 下午2:49:39
 */
public class MyCustomConverter implements CustomConverter {

	@Override
	public Object convert(Object existingDestinationFieldValue, Object sourceFieldValue, Class<?> destinationClass,
			Class<?> sourceClass) {
		Object obj = null;
		if (null != sourceFieldValue) {
			if (sourceFieldValue instanceof Integer) {
				if (((Integer) sourceFieldValue).intValue() == 1900) {
					obj = "20世纪";
				} else if (((Integer) sourceFieldValue).intValue() == 2000) {
					obj = "21世纪";
				}
			} else if (sourceFieldValue instanceof String) {
				if ("20世纪".equals(sourceFieldValue)) {
					obj = 1900;
				} else if ("21世纪".equals(sourceFieldValue)) {
					obj = 2000;
				}
			}
		}
		return obj;
	}

}

 

 

 

到这里,我们来看下真正的代码转换测试类:

 

package dozer;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.dozer.DozerBeanMapper;

/**
 * @author zhuc
 * @create 2013-3-28 下午3:15:49
 */
public class Test {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		List<String> mappers = new ArrayList<String>();
		mappers.add("mapper.xml");

		DozerBeanMapper dozer = new DozerBeanMapper();
		dozer.setMappingFiles(mappers);

		Book book = new Book();
		book.setId(100); // id	2个JavaBean一致
		book.setName("明天"); // Book:name(String)  <->  BookVo:nameVo(String)	类型一致,名称不一致
		book.setAuthor("James"); // Book:author(String)  <->  BookVo:authorVo(String)	类型一致,名称不一致
		book.setCapacity("123"); // Book:capacity(String)  <->  BookVo:capacity(Integer)	类型不一致,名称一致
		book.setBirthday(new Date()); // Book:birthday(Date)  <->  BookVo:day(String)	类型名称都不一致,且Date<->String互转
		book.setBookTypeName("科教类"); // Book:bookTypeName(String)  <->  BookVo:BookType:name(String)	源类的字段映射为目标类的复杂对象的字段。
		book.setSource(1900); // Book:source(Integer)  <->  BookVo:source(String)	自定义的转换,需要实现dozer的CustomConverter接口

		BookVo vo = new BookVo();
		dozer.map(book, vo);

		System.out.println(book);
		System.out.println(vo);
	}

}

 

 

输出结果:

Book [id=100, name=明天, author=James, capacity=123, birthday=Thu Mar 28 16:00:20 CST 2013, bookTypeName=科教类, source=1900]
BookVo [id=100, nameVo=明天, authorVo=James, capacity=123, day=2013-03-28 16:00:20, bookType=BookType [name=科教类, desc=null], source=20世纪]

分享到:
评论

相关推荐

    dozer-5.5.1-API文档-中英对照版.zip

    赠送jar包:dozer-5.5.1.jar; 赠送原API文档:dozer-5.5.1-javadoc.jar; 赠送源代码:dozer-5.5.1-sources.jar; 赠送Maven依赖信息文件:dozer-5.5.1.pom; 包含翻译后的API文档:dozer-5.5.1-javadoc-API文档-...

    dozer-5.5.1.jar

    dozer-5.5.1.jar dozer-5.5.1.jar dozer-5.5.1.jar dozer-5.5.1.jar

    dozer的使用实例

    内含dozer的完整实例,以及jar包。dozer比BeanUtils更灵活,同时可以很容易地跟spring集成。也可以用注解@Mapping("asstManagerId")来代替xml配置

    dozer的eclipse插件

    dozer的eclipse插件,使用该插件可以可视化编辑对应属性,简化你的编码工作

    dozer-user-guide

    dozer是一种JavaBean的映射工具,类似于apache的BeanUtils

    org.dozer JAR 包(实现java bean mapper)

    dozer是一款优秀的java bean映射开源框架,完成深度转换Bean&lt;-&gt;Bean的Mapper实现

    dozer小例子-bean复制

    需要lib[dozer-5.0.jar, commons-lang.jar],有需要的请猛击下载

    dozer复杂类型测试类.zip

    dozer 的配置Mapping,包含普通映射配置,List复杂类型配置。ReqParam.json 是转换类的参数值,StringUtils 读取文件。

    javaEE的对象拷贝工具dozer

    该文件是拷贝对象工具dozer相关的jar包和dozer的配置用法的详细说明,简洁实用。

    dozer-5.3.2-src.zip

    dozer是一种JavaBean的映射工具,类似于apache的BeanUtils。但是dozer更强大,它可以灵活的处理复杂类型之间的映射

    dozer5.2 jar包

    下载内容包含 commons-beanutils-1.7.0.jar commons-collections.jar commons-lang-2.5.jar dozer-5.2.0.jar等

    dozer(PDF)

    有关于dozer的用法  毕业了~ 所有资料拿出来分享~ 难免有错误~多见谅~

    springboot-dozer

    dozer是一种JavaBean的映射工具,类似于Apache的BeanUtils。它可以灵活地处理复杂类型之间的映射。不但可以进行简单的属性映射、复杂的类型映射、双向映射、递归映射等,并且可以通过XML配置文件进行灵活的配置。 ...

    dozer5.5.1 ( 可集成spring 及 OSGi )

    dozer5.5.1 ( 可集成spring 及 OSGi ) , 不论在spring及osgi 下均可使用 包含所有5.5.1 所依赖的jar包,可根据需求添加。

    dozer 3.0.2

    好用简洁的开源mac osx下的菜单栏管理软件,完美替代Bartender

    dozer-5.5.1-API文档-中文版.zip

    赠送jar包:dozer-5.5.1.jar; 赠送原API文档:dozer-5.5.1-javadoc.jar; 赠送源代码:dozer-5.5.1-sources.jar; 赠送Maven依赖信息文件:dozer-5.5.1.pom; 包含翻译后的API文档:dozer-5.5.1-javadoc-API文档-...

    复制bean的开源工具Dozer

    NULL 博文链接:https://gaojiewyh.iteye.com/blog/1528587

    Dozer 使用

    NULL 博文链接:https://bruceliu02.iteye.com/blog/1771227

Global site tag (gtag.js) - Google Analytics