dozker--实现map 实体 DTO之间的相互转化

Dozer是一款强大的Java对象转换工具,支持复杂类型的递归数据复制。本文介绍Dozer的基本用法,包括简单的JavaBean之间的转换及通过配置文件实现自定义字段映射的方法。此外,还介绍了Dozer在Spring框架中的集成方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Dozer 是一个对象转换工具。

Dozer可以在JavaBean到JavaBean之间进行递归数据复制,并且这些JavaBean可以是不同的复杂的类型,

所有的mapping,Dozer将会很直接的将名称相同的fields进行复制,如果field名不同,或者有特别的对应要求,则可以在xml中进行定义

dozer是深层复制的,即使原实体中有其他对象的引用,只要目标数据中有对应的引用对象或者配置文件中指定了对应的mapper,目标数据也会获取这个引用对象

java工具类是:

public class DozerBeanCopy {

	 private static DozerBeanMapper dozer = new DozerBeanMapper();
	 
	 public static void copy(Object source, Object destinationObject) {
	        dozer.map(source, destinationObject);
	 }
	 
	public static void main(String[] args) {		
		//map ->实体  对于map中和实体中属性名一样的字段会自动进行转化,不一样的字段转换不成功
		Student student=new Student();
		HashMap<Object, Object> map=new HashMap<Object,Object>();
		map.put("id", "id");
		map.put("name", "name");
		map.put("age1", 11);
		copy(map, student);
		System.out.println(student.getName());
		System.out.println(student.getAge());
		
		//实体->dto dto->实体的相互转化,其中目标数据不一样的字段不会自动转化
		Student student2=new Student("id", "name", 11);
		StudentDTO sDto=new StudentDTO();
		copy(student2, sDto);
		System.out.println(sDto.getName());
		
		//方式二:该方式用于数据类型不一致,或者名称不相同或者有级联关系等情况下的映射,该方式可以添加多个配置文件
		Student student3=new Student("id", "name", 11);
		StudentVO svo=new StudentVO();

		List myMappingFiles = new ArrayList();
		myMappingFiles.add("dozerBeanMapping.xml");
		DozerBeanMapper mapper = new DozerBeanMapper();
		mapper.setMappingFiles(myMappingFiles);
		mapper.map(student3, svo);
		System.out.println(svo.getNameVo());
		
	}

}

配置文件如下:

<?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">
<class-a>com.test.DozerBeanCopy.Student</class-a>
<class-b>com.test.DozerBeanCopy.StudentVO</class-b>
<field>
<a>name</a>
<b>nameVo</b>
</field>
<field>
<a>age</a>
<b>ageVo</b>
</field>
</mapping>
</mappings>


web:

1.在spring整合dozer的时候可以在spring的配置文件中加入以下代码:

<bean id="mapper" class="org.dozer.spring.DozerBeanMapperFactoryBean">
      <property name="mappingFiles">
<list>       <value>classpath*:dozer-config/dozerBeanMapping.xml</value>
          </list>
      </property>
   </bean>

2.在basecontroller或者baseService下面注入这个bean

private Mappermapper ;
public Mapper getMapper(){
   return mapper;
}
public void setMapper(Mapper mapper){
   this.mapper = mapper;
}

3.我们把dozker交给spring去管理后就可以使用以下方式直接复制对象

getMapper().map(sourceObject,DestinationObject.class)




使用过程中的错误:

1.xml解析错误---好吧,我新建的文件,第一行写成这样了

<?xmlversion="1.0"encoding="UTF-8"?>

so,你看出来了没?应该这样 

<?xmlversion="1.0" encoding="UTF-8"?>

Caused by: org.xml.sax.SAXException: Parsing Fatal Error
Line:    1
URI:     null
Message: White space is required before the encoding pseudo attribute in the XML declaration.
	at org.dozer.loader.xml.XMLParserFactory$DozerDefaultHandler.fatalError(XMLParserFactory.java:113)
	at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.fatalError(ErrorHandlerWrapper.java:177)
	at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:388)


2.缺少slf4j-api.jar的依赖

Caused by: java.lang.ClassNotFoundException: org.slf4j.LoggerFactory
	at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
3.缺少commons-lang3.jar依赖

Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/lang3/StringUtils
	at org.dozer.util.ResourceLoader.getResource(ResourceLoader.java:59)
	at org.dozer.util.DefaultClassLoader.loadResource(DefaultClassLoader.java:49)
	at org.dozer.config.GlobalSettings.loadGlobalSettings(GlobalSettings.java:116)
4.缺少 commons-beans.jar

Caused by: java.lang.ClassNotFoundException: org.apache.commons.beanutils.ConversionException
	at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.net.URLClassLoader.findClass(URLClassLoader.java:190)

总之,需要引入的jar包有:






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值