使用ModelMapper踩过的坑

ModelMapper 是一个java对象自动映射的第三方架包。

ModelMapper是一个从对象到对象(object-to-object)的框架,能将Java Bean(Pojo)对象从一种表现形式转化为另一种表现形式。它采用“通过约定来配置”的方式,自动匹配不同的对象映射,同时具备满足某些特殊需求的高级功能。在项目中很多时候需要把Model和DTO两个模型类来回转换,保证Model对外是隐私的,同时类似密码之类的属性也能很好地避免暴露在外了。那么ModelMapper就是为了方便转换而实现的一个类库。

1.ModelMapper入口类

ModelMapper这个工具的入口类就是ModelMapper,因此转换就需要从这个类入口.简单看下API

addConverter() :顾名思义,添加转换器

addMappings() :添加映射器

createTypeMap() :创建A-B的转换器关系

getConfiguration() :获取配置

map() ;映射处理

今天在使用ModelMapper的时候遇到了一个bug问题,于是重显了场景,下面是截图: 

使用ModelMapper踩过的坑_第1张图片

使用ModelMapper踩过的坑_第2张图片

代码:

    @Transactional(rollbackFor = Exception.class)
    public Long createLeaveDO() throws Exception {
        LeaveDO leaveDO = new LeaveDO();
        leaveDO.setState("123");
        List leaveDOList = new ArrayList();
        for (int i = 0; i < 5; i++) {
           leaveDO.setId(null);
           LeaveDO saveLeaveDO = modelMapper.map(leaveDO,LeaveDO.class);
           saveLeaveDO.setReason("我想休息"+i);
           leaveManager.insertLeaveDO(saveLeaveDO);
           leaveDOList.add(saveLeaveDO);
        }
    }

调整后的代码:

    @Transactional(rollbackFor = Exception.class)
    public Long createLeaveDO() throws Exception {   
        LeaveDO leaveDO = new LeaveDO();
        leaveDO.setState("123");
        List leaveDOList = new ArrayList();
        for (int i = 0; i < 5; i++) {
           leaveDO.setId(null);     
           //每次循环都会创建一个新的对象和不同的引用      
           LeaveDO saveLeaveDO = new LeaveDO();
           BeanUtils.copyProperties(leaveDO,saveLeaveDO);
           saveLeaveDO.setReason("我想休息"+i);
           leaveManager.insertLeaveDO(saveLeaveDO);
           leaveDOList.add(saveLeaveDO);
        }
    }

分析:从截图可以看出leaveDOList里面的对象及其引用都是同一个,用的是leaveDO的引用,最后导致所有的值都是最后赋的值,跟期望的值不一样。原因是,用的是同一个引用,重新给对象赋值的时候,相同引用的对象值也会改变,最后数据库存保存的数据是没问题的,但是集合里面所有对象的属性值是跟最后一个对象的属性值相同的。

总结:在使用java对象的时候,对于循环操作时,特别要注意是否用的是同一引用,属性值得改变回影响该引用所对应的所有对象。

你可能感兴趣的:(开发踩过的坑)