`

复制bean的开源工具Dozer

 
阅读更多

项目中,经常会遇到各层对象之间相互进行值传递的过程,如在数据据持久层有一持久类ClassA,在视图层可能会变为ViewA,通常情况下,如果两个类结构一样,最常使用的是BeanUtils.copyProperties(src,aim)方法将一个对象的值赋给另一个对象!但是如果属性不同或者名称不同,则需要Dozer来完成,通过灵活的配置,达到不同对象间的拷贝!dozer当字段名称相同时,可以直接复制,不相同时,可通过配置文件进行复制

 

具体看一个比较复杂的例子:

 

package com.jasson.mode;

public enum GenderType {
	male,	//男   
	female	//女
}

 

package com.jasson.mode;

import java.util.Date;

/**
 * @author jgao1
 * 
 */
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;
	}
}

 

package com.jasson.mode;

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;
	}
}

 

package com.jasson.mode;

public class User {
	private int id;
	private String name;
	private String password;
	private Info info;
	private String option;

	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;
	}
	
	public String getOption() {
		return option;
	}

	public void setOption(String option) {
		this.option = option;
	}
}

 

package com.jasson.mode;

public class UserVO {
	private int id;
	private String userName;
	private String password;
	private InfoVO info;
	private Integer option;

	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;
	}

	public Integer getOption() {
		return option;
	}

	public void setOption(Integer option) {
		this.option = option;
	}
}

 两个对象相互转换,需要如下自定义convert

package com.jasson.util;

import org.dozer.CustomConverter;

import com.jasson.mode.GenderType;

public class EnumConverter implements CustomConverter {
	public Object convert(Object destinationFieldValue,
			Object sourceFieldValue, Class<?> destinationClass,
			Class<?> sourceClass) {
		Object returnVale = null;
		if (sourceFieldValue != null) {
			if (sourceFieldValue instanceof Integer) {
				if ((Integer) sourceFieldValue == 0) {
					returnVale = GenderType.male;
				} else if ((Integer) sourceFieldValue == 1) {
					returnVale = GenderType.female;
				}
			} else if (sourceFieldValue instanceof Enum) {
				if (sourceFieldValue == GenderType.male) {
					returnVale = 0;
				} else if (sourceFieldValue == GenderType.female) {
					returnVale = 1;
				}
			}
		}
		return returnVale;
	}
}

 

package com.jasson.util;

import org.dozer.CustomConverter;

public class SpecialConverter implements CustomConverter {
	public Object convert(Object destinationFieldValue,
			Object sourceFieldValue, Class<?> destinationClass,
			Class<?> sourceClass) {
		Object returnVale = null;
		if (sourceFieldValue != null) {
			if (sourceFieldValue instanceof Integer) {
				if ((Integer) sourceFieldValue == 0) {
					returnVale = "NO";
				} else if ((Integer) sourceFieldValue == 1) {
					returnVale = "OK";
				}
			} else if (sourceFieldValue instanceof String) {
				if (sourceFieldValue.equals("NO")) {
					returnVale = 0;
				} else if (sourceFieldValue.equals("OK")) {
					returnVale = 1;
				}
			}
		}
		return returnVale;
	}
}

 

配置的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">
	  
	  <configuration>
		<stop-on-errors>true</stop-on-errors>
		<date-format>yyyy-MM-dd</date-format>
		<wildcard>true</wildcard>
		<custom-converters> 
			<converter type=" com.jasson.util.EnumConverter">
				<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>com.jasson.mode.User</class-a>
      	<class-b>com.jasson.mode.UserVO</class-b>
		<field>
			<a>name</a>
			<b>userName</b>
		</field>
      	<field>
			<a>info.createDate</a>
			<b>info.date</b>
		</field>
		<field custom-converter="com.jasson.util.EnumConverter">
			<a>info.gender</a>
			<b>info.gender</b>
		</field>
		<field custom-converter="com.jasson.util.SpecialConverter">
			<a>option</a>
			<b>option</b>
		</field>
      </mapping>
</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" xmlns:jee="http://www.springframework.org/schema/jee"
	xmlns:tx="http://www.springframework.org/schema/tx" 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/tx 
	http://www.springframework.org/schema/tx/spring-tx.xsd 
	http://www.springframework.org/schema/jee 
	http://www.springframework.org/schema/jee/spring-jee.xsd 
	http://www.springframework.org/schema/context 
	http://www.springframework.org/schema/context/spring-context.xsd" default-lazy-init="true">
	<bean id="mapper" class="org.dozer.spring.DozerBeanMapperFactoryBean">
		<property name="mappingFiles">
			<list>
				<value>classpath*:dozerconfig/dozerBeanMapping.xml</value>
			</list>
		</property>
	</bean>
</beans>

 

package com.jasson.Test;

import java.util.Date;

import org.dozer.Mapper;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.jasson.mode.GenderType;
import com.jasson.mode.Info;
import com.jasson.mode.User;
import com.jasson.mode.UserVO;

public class MainTest {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		ApplicationContext ctx = new ClassPathXmlApplicationContext(
				"applicationContext.xml");
		Mapper mapper = (Mapper) ctx.getBean("mapper");
		Info info = new Info();
		info.setCreateDate(new Date());
		info.setGender(GenderType.female);
		info.setId(100);
		
		User user = new User();
		user.setId(100);
		user.setName("jasson");
		user.setPassword("password");
		user.setInfo(info);
		user.setOption("NO");

		UserVO uservo = mapper.map(user, UserVO.class);
		System.out.println(user.getId()+"<------>"+uservo.getId());
		System.out.println(user.getPassword()+"<------>"+uservo.getPassword());
		System.out.println(user.getName()+"<------>"+uservo.getUserName());
		System.out.println(user.getInfo().getId()+"<------>"+uservo.getInfo().getId());
		System.out.println(user.getInfo().getGender()+"<------>"+uservo.getInfo().getGender());
		System.out.println(user.getInfo().getCreateDate()+"<------>"+uservo.getInfo().getDate());
		System.out.println(user.getOption()+"<------>"+uservo.getOption());
	}
}

 

结果如下:

 

100<------>100
password<------>password
jasson<------>jasson
100<------>100
female<------>1
Mon May 14 18:15:29 CST 2012<------>2012-05-14
NO<------>0

实现完全的复制功能。

 

分享到:
评论

相关推荐

    dozer小例子-bean复制

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

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

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

    javaEE的对象拷贝工具dozer

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

    Dozer类转换,List实体类型之间的快速转换

    支持Bean类型转换,前提是字段相同。支持List实体之间的类型转换,注意当source不能为null。

    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-user-guide

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

    dozer的使用实例

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

    dozer的eclipse插件

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

    dozer-5.3.2-src.zip

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

    dozer复杂类型测试类.zip

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

    springboot-dozer

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

    dozer(PDF)

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

    dozer5.2 jar包

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

    dozer 3.0.2

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

    深度转换Bean<->Bean的Mapper

    NULL 博文链接:https://vernonchen163.iteye.com/blog/1879387

    dozer5.5.1 ( 可集成spring 及 OSGi )

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

Global site tag (gtag.js) - Google Analytics