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配置的方式配置映射关系 

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值