dozer无法映射java8中的LocalDateTime类型的解决方案
作者:互联网
dozer是一个很方便的bean映射工具包,可以很轻松地做到两个bean对象的属性值复制,但是dozer包在2014年的时候停止更新了,而jdk1.8也是2014年发布的,所以对于java8中的新日期的映射关系并没有在dozer中配置,所以在项目中jdk使用了1.8,在使用了LocalDateTime类型设置日期的时候,即使两个bean对象都是相同的LocalDateTime,使用dozer的api,即DozerBeanMapper.map()方法进行日期类映射的时候,是会报错的:java.lang.NoSuchMethodException: java.time.LocalDateTime.<init>(),如果继续使用dozer的话解决这个问题很麻烦
进入dozer官网(http://dozer.sourceforge.net/)看一下
官网显示的dozer的jar包最新的是5.5.1,2014年4月22日之后就没更新了,所以这就是为什么dozer无法映射java8中的新日期,因为java8出来之后,dozer已经不更新了。
dozer的jar包 依赖是这两个,结合springboot项目,maven依赖:
<dependency>
<groupId>net.sf.dozer</groupId>
<artifactId>dozer-spring</artifactId>
<version>5.5.1</version>
</dependency>
<dependency>
<groupId>net.sf.dozer</groupId>
<artifactId>dozer</artifactId>
<version>5.5.1</version>
</dependency>
注意这个添加的是dozer,groupid是net.sf.dozer。这个版本的dozer是无法映射java8新日期的,所以为了解决这个问题,有很方便的方法,既然java8这么普遍使用,那么当然就会有很多人在使用dozer中遇到这个问题,所以呢,后来就有大神在github上开源了dozer的升级版
所以呢,解决这个问题就是替换net.sf.dozer的dozer 依赖jar包,替换为dozerMapper这个jar包,就可以轻松解决这个问题了
下边给上这个项目的github地址:https://github.com/DozerMapper/dozer
使用springboot的直接加这个项目的starter就可以了,如下:
加上这个依赖就可以了,用的版本是:
这样就可以正常映射java8新日期了
注意,更换后的jar包,api也变了,之前的旧的dozer使用的映射类是DozerBeanMapper类,更换jar包后,使用的映射类是Mapper类(注意导包的时候不要导入成mybatis的Mapper类了)
dozerBeanMapper配置类:
package com.gbiac.tmc.newenergy.configuration;
import com.github.dozermapper.core.DozerBeanMapperBuilder;
import com.github.dozermapper.core.Mapper;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* 配置dozermapper映射器
* @author
* @version 1.0
* @date: 2021/1/18
*/
@Configuration
public class DozerBeanMapperConfig {
@Bean
public Mapper dozerBeanMapper() {
return DozerBeanMapperBuilder.buildDefault();
}
}
对于两个对象之间属性名不一致的,可以使用注解@Mapping,源对象中的属性名是changeWay,但是目标对象属性名是refundChangeWay
比较复杂的对象关系映射还可以使用xml配置的方式配置映射关系
标签:dozer,映射,jar,github,LocalDateTime,net,java8 来源: https://blog.csdn.net/u011174699/article/details/113358896