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问题,于是重显了场景,下面是截图:
代码:
@Transactional(rollbackFor = Exception.class)
public Long createLeaveDO() throws Exception {
LeaveDO leaveDO = new LeaveDO();
leaveDO.setState("123");
List<LeaveDO> leaveDOList = new ArrayList<LeaveDO>();
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<LeaveDO> leaveDOList = new ArrayList<LeaveDO>();
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对象的时候,对于循环操作时,特别要注意是否用的是同一引用,属性值得改变回影响该引用所对应的所有对象。