首页 > 技术文章 > Java 属性映射(DozerBeanMapper)

hanjun0612 2018-10-11 10:23 原文

package com.tenyears.common.utils;

import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import org.apache.commons.beanutils.BeanUtils;
import org.dozer.DozerBeanMapper;
import org.dozer.Mapper;
import org.dozer.loader.api.BeanMappingBuilder;
import org.dozer.loader.api.TypeMappingOption;
import org.dozer.loader.api.TypeMappingOptions;
import org.springframework.cglib.beans.BeanMap;

import java.lang.reflect.Field;
import java.util.*;

public class DozerMapperUtil {
    static Mapper mapper = new DozerBeanMapper();

    /**
     * 将list转换为vo的list
     * Example : List<VO> resultList=DozerMapperUtil.mapList(list, VO.class);
     * @param source
     * @param destType
     * @return
     */
    public static <T, U> List<U> mapList(final List<T> source, final Class<U> destType) {
        final List<U> dest = new ArrayList<U>();
        for (T element : source) {
            dest.add(mapper.map(element, destType));
        }
        return dest;
    }

    /**
     * 将继承自Collection(Set,List....)的转换为VO的List
     * Example : Collection<VO> planLog = DozerMapperUtil.mapCollection(Set<>, VO.class);
     * @param source
     * @param destType
     * @param <T>
     * @param <U>
     * @return
     */
    public static <T, U> Collection<U> mapCollection(final Collection<T> source, final Class<U> destType) {
        final Collection<U> dest = new ArrayList<>();
        for (T element : source) {
            dest.add(mapper.map(element, destType));
        }
        return dest;
    }

    /**
     * 转换单个vo对象,自动生成目标实例化对象
     * Example : DozerMapperUtil.map(entity,VO)
     * @param source
     * @param destType
     * @return
     */
    public static <U> U map(final Object source, final Class<U> destType) {
        return mapper.map(source, destType);
    }

    /**
     * 将source的所有属性拷贝至target,source里没有的字段,target里不覆盖
     * Example : DozerMapperUtil.map(entity,VO)
     * @param source
     * @param target
     * @return
     */
    public static <U> void map(final Object source, final U target) {
        DozerBeanMapper mapper = new DozerBeanMapper();
        mapper.addMapping(new BeanMappingBuilder() {
            @Override
            protected void configure() {
                mapping(source.getClass(), target.getClass(),
                        new TypeMappingOption[]{TypeMappingOptions.mapNull(false)});
            }

        });
        mapper.map(source, target);
    }

    /**
     * 将source的所有属性拷贝至target,source里没有的字段,target里不覆盖
     * Example : DozerMapperUtil.map(entity,VO,True)
     * @param source
     * @param target
     * @param nullCover 为true时,source中的值为null也覆盖
     * @param <U>
     */
    public static <U> void map(final Object source, final U target, boolean nullCover) {
        DozerBeanMapper mapper = new DozerBeanMapper();
        mapper.addMapping(new BeanMappingBuilder() {
            @Override
            protected void configure() {
                mapping(source.getClass(), target.getClass(),
                        new TypeMappingOption[]{TypeMappingOptions.mapNull(nullCover)});
            }

        });
        mapper.map(source, target);
    }


    /**
     * @param sourceBean *            被提取的对象bean
     * @param targetBean *            用于合并的对象bean
     * @return targetBean 合并后的对象
     * @Title: map2
     * @Description: (因为在使用map方法时遇到有字段没有复制成功 , 所以重写了新方法 , 经试用没问题 。)该方法是用于相同对象不同属性值的合并,如果两个相同对象中同一属性都有值,
     * 那么sourceBean中的值会覆盖tagetBean重点的值
     * @return: Object
     */
    @SuppressWarnings("unused")
    public static Object map2(Object sourceBean, Object targetBean) {
        Class sourceBeanClass = sourceBean.getClass();
        Class targetBeanClass = targetBean.getClass();

        Field[] sourceFields = sourceBeanClass.getDeclaredFields();
        Field[] targetFields = sourceBeanClass.getDeclaredFields();
        for (int i = 0; i < sourceFields.length; i++) {
            Field sourceField = sourceFields[i];
            Field targetField = targetFields[i];
            sourceField.setAccessible(true);
            targetField.setAccessible(true);
            try {
                if (!(sourceField.get(sourceBean) == null)) {
                    targetField.set(targetBean, sourceField.get(sourceBean));
                }
            } catch (IllegalArgumentException | IllegalAccessException e) {
                e.printStackTrace();
            }
        }
        return targetBean;
    }

    /**
     * 将bena转换成map
     * Example : beanToMap(vo)
     * @param bean
     * @param <T>
     * @return
     */
    public static <T> Map<String, String> beanToMap(T bean) {
        if (null == bean)
            return null;
        try {
            Map<String, String> map = BeanUtils.describe(bean);
            // 移除key=class
            map.remove("class");
            return map;
        } catch (Exception e) {
            System.out.println("JavaBean-->Map转换失败:" + e.getMessage());
            e.printStackTrace();
            return null;
        }
    }


    /**
     * 将map转换成bean
     * Example : mapToBean(map,VO.class)
     * @param map
     * @param t
     * @param <T>
     * @return
     */
    @SuppressWarnings("unchecked")
    public static <T> T mapToBean(Map map, Class<T> t) {
        try {
            T newBeanInstance = (T) t.newInstance();
            BeanUtils.populate(newBeanInstance, map);
            return newBeanInstance;
        }
        catch (Exception e) {
            System.out.println("Map-->JavaBean转换失败:" + e.getMessage());
            e.printStackTrace();
            return null;
        }

    }

    /**
     * List<bean>转换成List<Map>
     * Example : beansToMaps(List<VO>)
     * @param listbean
     * @param <T>
     * @return
     */
    public static <T> List<Map<String, String>> beansToMaps(List<T> listbean) {
        List<Map<String, String>> maps = Lists.newArrayList();
        if (listbean == null || listbean.size() == 0) {
            return null;
        }
        for (T bean : listbean) {
            if (bean != null) {
                Map<String, String> beanToMaps = beanToMap(bean);
                maps.add(beanToMaps);
            }
        }
        return maps;
    }


    /**
     * list<Map>转换成List<bean>
     * Example : mapsToBeans(List<Map>,VO.class)
     * @param listmap
     * @param t
     * @param <T>
     * @return
     */
    public static <T> List<T> mapsToBeans(List<Map> listmap, Class<T> t) {
        List<T> list = Lists.newArrayList();
        if (listmap == null || listmap.size() == 0) {
            return null;
        }
        for (Map map : listmap) {
            T t2 = mapToBean(map, t);
            list.add(t2);
        }
        return list;


    }

}

 

推荐阅读