`

复制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复制

    在这个"dozer小例子-bean复制"中,我们将深入探讨Dozer库的使用方法以及它如何帮助我们高效地完成bean复制。 首先,Dozer的核心功能是提供对象之间的自动映射。在Java中,手动复制bean可能会导致代码冗余且易出错,...

    javaEE的对象拷贝工具dozer

    Java EE对象拷贝工具Dozer是一款强大的数据映射库,它简化了在Java对象之间进行深度复制的过程。在软件开发中,特别是在业务层处理数据时,我们经常需要将一个对象的属性值复制到另一个对象中,Dozer提供了一个优雅...

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

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

    dozer(PDF)

    Dozer是一款功能强大但使用简单的Java Bean到Java Bean映射工具,能够递归地从一个对象复制数据到另一个对象。通常,这些Java Beans会是不同复杂度的类型。 **1.1 下载** Dozer可以方便地通过其官方网站进行下载。...

    dozer的使用实例

    在实际开发中,尤其是在涉及到数据模型转换时,Dozer是一个非常实用的工具。 **集成Spring** Dozer可以无缝地与Spring框架集成,使得在Spring应用中使用Dozer变得更加便捷。通过在Spring配置文件中声明...

    dozer复杂类型测试类.zip

    通过定义映射规则,Dozer可以自动地将源对象的属性值复制到目标对象的相应属性上,而无需手动编写繁琐的赋值代码。例如,如果有一个`User`类和一个`UserProfile`类,它们都有`name`、`email`等相同属性,Dozer就能...

    dozer-user-guide

    Dozer是一个JavaBean的映射工具,用于在Java对象之间转换属性值。它类似于Apache的BeanUtils,但Dozer特别优化了复杂对象的映射,可以将一个对象的字段映射到另一个对象,这在分层架构中尤其有用。在分层架构中,...

    dozer的eclipse插件

    **Dozer Eclipse插件**是面向Java开发人员的一款强大工具,尤其在进行对象-对象映射(Object-Object Mapping)时能提供巨大的便利。Dozer是一个开源库,它简化了Java对象之间的数据转换过程,而Dozer Eclipse插件则...

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

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

    深度转换Bean<->Bean的Mapper

    首先,BeanMapper的核心功能是将一个对象的属性值复制到另一个对象,即使这两个对象的结构不同。这种转换对于数据模型间的映射非常有用,例如在业务逻辑层和数据访问层之间,或者在API响应与内部模型之间。 在描述...

    dozer5.5.1 ( 可集成spring 及 OSGi )

    在Spring框架中,Dozer可以作为Bean之间的映射工具,简化数据绑定和对象转换过程。而OSGi环境下,Dozer的可集成性使得开发者可以在模块化的应用程序中灵活使用,各个模块可以通过Dozer实现数据交换,同时保持低耦合...

    dozer5.2 jar包

    Dozer是一个强大的Java对象映射框架,它的核心功能是将一个对象的属性值复制到另一个对象的相应属性上,这在处理对象持久化、服务接口转换、数据展示层与业务逻辑层之间转换等方面非常有用。其主要特性包括: 1. **...

    dozer-5.3.2-src.zip

    Dozer是一个开源的JavaBean映射框架,它的主要目标是简化Java对象到Java对象之间的映射过程。与BeanUtils相比,Dozer不仅支持简单的属性映射,还能够处理复杂的对象类型映射,如集合、自定义对象以及嵌套对象的映射...

    dozer5.3.2

    Dozer是一个强大的开源库,专为解决此类问题而设计。本文将深入探讨Dozer 5.3.2版本的功能特性,以及如何利用它进行高效的数据映射和校验。 Dozer的核心功能在于对象到对象的映射,它可以自动地将一个对象的属性值...

    Dozer详解

    总结来说,Dozer作为一款强大的对象映射工具,提供了丰富的映射功能,简化了Java对象间的转换工作。通过灵活的配置和自定义转换器,开发者可以应对各种复杂的映射需求。然而,在选择使用Dozer时,也应考虑其可能存在...

    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 使用总结,也许对你有帮助

    // 创建 Dozer Bean Mapper 实例 Mapper mapper = new DozerBeanMapper(); // 定义源对象 SourceObject source = new SourceObject(); source.setName("John Doe"); // 转换为目标对象 TargetObject target = ...

Global site tag (gtag.js) - Google Analytics