Dozer深复制

maven导入

<!-- https://mvnrepository.com/artifact/net.sf.dozer/dozer -->
<dependency>
    <groupId>net.sf.dozer</groupId>
    <artifactId>dozer</artifactId>
    <version>5.5.1</version>
</dependency>

使用

硬编码

dozer使用教程 https://blog.csdn.net/drdongshiye/article/details/87027855

工具类1

public class DozerUtil {
    private DozerUtil() {
    }

    /**
     * 持有Dozer单例, 避免重复创建DozerMapper消耗资源.
     */
    private static DozerBeanMapper dozer = new DozerBeanMapper();


    /**
     * 基于Dozer转换对象的类型.
     */
    public static <T> T map(Object source, Class<T> destinationClass) {
        return dozer.map(source, destinationClass);
    }


    /**
     * 基于Dozer转换Collection中对象的类型.
     */
    public static <T> List<T> mapList(Collection<?> sourceList, Class<T> destinationClass) {
        List<T> destinationList = Lists.newArrayList();
        for (Object sourceObject : sourceList) {
            T destinationObject = dozer.map(sourceObject, destinationClass);
            destinationList.add(destinationObject);
        }
        return destinationList;
    }


    /**
     * 基于Dozer将对象A的值拷贝到对象B中.
     */
    public static void copy(Object source, Object destinationObject) {
        dozer.map(source, destinationObject);
    }
}

工具类2

public class BeanUtil {

    private BeanUtil() {
    }

    private static final DozerBeanMapper DOZER = newInstance();

    /**
     * 把source中的值复制到target
     */
    public static void copy(Object source, Object target) {
        if (null == source || null == target) {
            return;
        }
        DOZER.map(source, target);
    }

    /**
     * 把source中的值复制到target
     */
    public static <T> T copy(Object source, Class<T> target) {
        return null == source || null == target ? null : DOZER.map(source, target);
    }

    /**
     * Copy List集合时可用
     */
    @SuppressWarnings("unchecked")
    public static <T> List<T> copy(List<T> source) {
        return new ArrayList<T>(source.size()) {
            private static final long serialVersionUID = 1L;

            {
                for (T src : source) {
                    add((T) copy(src, src.getClass()));
                }
            }
        };
    }

    /**
     * Copy List集合时可用[重载]
     */
    public static <E> List<E> copy(List<?> source, Class<E> target) {
        return new ArrayList<E>(source.size()) {
            private static final long serialVersionUID = 1L;

            {
                for (Object src : source) {
                    add(copy(src, target));
                }
            }
        };
    }

    /**
     * Bean属性输出为Map
     */
    public static Map<String, Object> toMap(Object obj) {

        if (null == obj) {
            return null;
        }
        Map<String, Object> retMap = new LinkedHashMap<String, Object>();

        for (Class<?> clazz = obj.getClass(); !clazz.isAssignableFrom(Object.class); ) {
            for (Field field : clazz.getDeclaredFields()) {
                if (!Modifier.isStatic(field.getModifiers())) {
                    try {
                        field.setAccessible(true);
                        Object val = field.get(obj);
                        if (null != val) {
                            retMap.put(field.getName(), val);
                        }
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }
            clazz = clazz.getSuperclass();
        }

        return retMap;
    }

    /**
     * 返回默认实例
     */
    public static DozerBeanMapper newInstance() {
        return new DozerBeanMapper();
    }

}

spring中使用

dozer 简单用法 https://www.cnblogs.com/jonney-wang/p/6663860.html

错误

深度复制需要有空构造方法

org.dozer.MappingException: java.lang.NoSuchMethodException: com.chinaredstar.contract.mis.model.dto.ContractAttachDTO.<init>()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值