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