Java 屬性映射(DozerBeanMapper)


package com.kps.common.utils;

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 java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

public class DozerMapperUtil{
    static  Mapper mapper = new DozerBeanMapper();
    /**
     * 將list轉換為vo的list
     * @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<E>
    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對象,自動生成目標實例化對象
     * @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里不覆蓋
     * @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);
    }


    /**
     * @Title: map2
     * @Description: (因為在使用map方法時遇到有字段沒有復制成功,所以重寫了新方法,經試用沒問題。)該方法是用於相同對象不同屬性值的合並,如果兩個相同對象中同一屬性都有值,
     *               那么sourceBean中的值會覆蓋tagetBean重點的值
     * @param sourceBean     *            被提取的對象bean
     * @param targetBean     *            用於合並的對象bean
     * @return targetBean 合並后的對象
     * @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;
    }
    
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM