spring boot 使用net.sf.dozer进行entity和dto、vo 实体类、集合之间的转换(不支持jdk1.8的日期类型转换,需要支持的看最后的)

需要注意:

  • net.sf.dozer是一个很方便的bean映射工具包,可以很轻松地做到两个bean对象的属性值复制,但是dozer包在2014年的时候停止更新了,

  • 而jdk1.8也是2014年发布的,所以对于java8中的新日期的映射关系并没有在dozer中配置,在Java8里面新出来了一些API,如LocalDate、LocalTime、LocalDateTime非常好用

  • 而在项目中jdk使用了1.8,在使用了LocalDateTime类型设置日期的时候,即使两个bean对象都是相同的LocalDateTime,使用net.sf.dozer的api,即DozerBeanMapper.map()方法进行日期类映射的时候,是会报错的:java.lang.NoSuchMethodException:

  • java.time.LocalDateTime.(),如果继续使用dozer的话解决这个问题很麻烦

  • 默认的情况下,在mybatis也不支持java8的时间、日期。直接使用会报错**

首先需要在项目的pom.xml文件中添加以下依赖包:

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

转换工具类:


import java.util.ArrayList;
import java.util.List;

import org.dozer.DozerBeanMapper;
import org.dozer.Mapper;

public class EntityConvertDtoAndVOUtils {

	private static Mapper mapper = new DozerBeanMapper();

	public static <D, E> E convertBean(D t, Class<E> clazz) {
		if (t == null) {
			return null;
		}
		return mapper.map(t, clazz);
	}

	/**
	 * 实例数组之间转换
	 */
	public static <D, E> List<E> convertArray(D[] ts, Class<E> clazz) {
		List<E> es = new ArrayList<E>();
		if (ts == null) {
			return es;
		}
		for (D d : ts) {
			E e = (E) convertBean(d, clazz);
			if (e != null)
				es.add(e);
		}

		return es;
	}

	/**
	 * List集合之间转换
	 */
	public static <D, E> List<E> convertList(List<D> ts, Class<E> clazz) {
		List<E> es = new ArrayList<E>();
		if (ts == null) {
			return es;
		}
		for (D d : ts) {
			E e = (E) convertBean(d, clazz);
			if (e != null)
				es.add(e);
		}
		return es;
	}
}
import org.dozer.Mapper;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;

/**
 * dozer 转换器
 */
@Component
public class GeneralConvertorUtils {

	@Resource
	Mapper mapper;

	/**
	 * List 实体类 转换器
	 *
	 * @param source 原数据
	 * @param clz    转换类型
	 * @param <T>
	 * @param <S>
	 * @return
	 */
	public <T, S> List<T> convertor(List<S> source, Class<T> clz) {
		if (source == null)
			return null;
		List<T> map = new ArrayList<>();
		for (S s : source) {
			map.add(mapper.map(s, clz));
		}
		return map;
	}

	/**
	 * Set 实体类 深度转换器
	 *
	 * @param source 原数据
	 * @param clz    目标对象
	 * @param <T>
	 * @param <S>
	 * @return
	 */
	public <T, S> Set<T> convertor(Set<S> source, Class<T> clz) {
		if (source == null)
			return null;
		Set<T> set = new TreeSet<>();
		for (S s : source) {
			set.add(mapper.map(s, clz));
		}
		return set;
	}

	/**
	 * 实体类 深度转换器
	 *
	 * @param source
	 * @param clz
	 * @param <T>
	 * @param <S>
	 * @return
	 */
	public <T, S> T convertor(S source, Class<T> clz) {
		if (source == null)
			return null;
		return mapper.map(source, clz);
	}

	public void convertor(Object source, Object object) {
		mapper.map(source, object);
	}

	public <T> void copyConvertor(T source, Object object) {
		mapper.map(source, object);
	}

}

/**
调用如下:
@Service
public class UsersService{
    @Resource
    GeneralConvertorUtils convertorUtils;
    
    @Override
    public List<UsersDTO> findAll() {
        List<Users> list = usersMapper.findAll();
        //关键代码
        List<UsersDTO> usersDTO =convertorUtils.convertor(list, UsersDTO.class);
        return usersDTO ;
    }
}
*/

具体使用如下:
//下面两段代码是将entity转换成dto;分别是单个对象转换和集合对象转换;一般用于向consumer提供数据。

//user是entity,从数据库中获取的对象
UserEnity user = new UserEntity();
EntityConvertDtoAndVOUtils.convertBean(user, UserDTO.class);
 

//userList是List集合,里面的对象是UserEntity的实例
List<UserEntity> userList = new ArrayList<>();
List<UserDTO> userDTOs = (List<UserDTO>)EntityConvertDtoAndVOUtils.convertList(userList,  UserDTO.class);

//下面例子是dto转entity,一般用于向provider传入对象

UserDTO userDto = new UserDTO();
UserEntity userEntity = (UserEntity)EntityConvertDtoAndVOUtils.convertBean(userDto, UserEntity.class);//将userDto转换成userEntity 

List<UserDTO> userDTOs= new ArrayList<>();
List<UserEntity> users = DtoEntityUtil.trans(userDtOs, UserEntity.class);//将dto集合userDTOs转换成entityList users

以上的映射工具不支持jdk1.8的新api

引入包:

dependency>
	<groupId>com.github.dozermapper</groupId>
	<artifactId>dozer-spring-boot-starter</artifactId>
	<version>6.5.2</version>
</dependency>

支持jdk1.8的新日期类型,如LocalDateTime的映射

package com.management.hospital.utils;

import com.github.dozermapper.core.DozerBeanMapperBuilder;
import com.github.dozermapper.core.Mapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.lang.NonNull;
import org.springframework.lang.Nullable;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import java.util.Collections;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;

/**
 *
 * dozer转换类  (支持jdk1.8的新日期类型,如LocalDateTime的映射)
 *
 * net.sf.dozer是一个很方便的bean映射工具包,可以很轻松地做到两个bean对象的属性值复制,但是dozer包在2014年的时候停止更新了,
 * 而jdk1.8也是2014年发布的,所以对于java8中的新日期的映射关系并没有在dozer中配置,在Java8里面新出来了一些API,如LocalDate、LocalTime、LocalDateTime
 * 非常好用,而在项目中jdk使用了1.8,在使用了LocalDateTime类型设置日期的时候,即使两个bean对象都是相同的LocalDateTime,使用dozer的api,即DozerBeanMapper.map()方法进行日期类映射的时候,是会报错的:java.lang.NoSuchMethodException:
 * java.time.LocalDateTime.<init>(),如果继续使用dozer的话解决这个问题很麻烦
 * 
 * 默认的情况下,在mybatis也不支持java8的时间、日期。直接使用会报错
 *
 * 
 */
@Component
public class DozerConvertorUtils {

	/**
	 * dozer转换的核心mapper对象
	 */
	private static Mapper dozerMapper;

	@Autowired
	private Mapper mapper;

	@PostConstruct
	private void construct() {
		DozerConvertorUtils.setDozerMapper(mapper);
	}

	private static void setDozerMapper(Mapper dozerMapper) {
		DozerConvertorUtils.dozerMapper = dozerMapper;
	}

	@Bean
	public Mapper dozerBeanMapper() {
		return DozerBeanMapperBuilder.buildDefault();
	}

	/**
	 * 转换实体为另一个指定的实体 任意一个参数为NULL时 会抛出NPE
	 * {@link com.github.dozermapper.core.util.MappingValidator#validateMappingRequest}
	 *
	 * @param source 源实体 不能为NULL
	 * @param clazz  目标实体 不能为NULL
	 * @param <T>    泛型
	 * @return 转换后的结果
	 */
	@NonNull
	public static <T> T convert(@NonNull Object source, @NonNull Class<T> clazz) {
		return dozerMapper.map(source, clazz);
	}

	/**
	 * 转换List实体为另一个指定的实体 source如果为NULL 会使用空集合 在目标实体为NULL时 会抛出NPE
	 * {@link com.github.dozermapper.core.util.MappingValidator#validateMappingRequest}
	 *
	 * @param source 源集合 可以为NULL
	 * @param clazz  目标实体 不能为NULL
	 * @param <T>    泛型
	 * @return 转换后的结果
	 */
	@Nullable
	public static <T> List<T> convert(@Nullable List<?> source, @NonNull Class<T> clazz) {
		return Optional.ofNullable(source).orElse(Collections.emptyList()).stream()
				.map(bean -> dozerMapper.map(bean, clazz)).collect(Collectors.toList());
	}
}

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值