使用BeanUtils.copyProperties复制对象列表仅得到最后一个元素的问题求助
问题原因
你犯了Java引用类型的典型错误:SlideModelDto dto的初始化放在了循环外部。整个循环里你始终操作同一个dto对象实例——每次调用BeanUtils.copyProperties(m,dto)只是把当前SlideModel的属性覆盖到这个对象上,然后反复将这个对象的引用添加到slideModelsDto列表里。
因为Java列表存储的是对象的引用地址而非对象本身,最终列表里所有元素都指向同一个dto实例,自然全是最后一次赋值的对象数据。
修复方案
把SlideModelDto的实例化操作移到循环内部,每次循环都创建新的dto对象:
try{ List<SlideModel> slideModels = slideRepository.findAll(); List<SlideModelDto> slideModelsDto = new ArrayList<>(); for (SlideModel m : slideModels) { // 每次循环新建一个dto实例 SlideModelDto dto = new SlideModelDto(); BeanUtils.copyProperties(m, dto); System.out.println("m: " + m); System.out.println("slideModelDto: " + dto); slideModelsDto.add(dto); } } catch (Exception e) { // 记得补充异常处理逻辑 }
补充说明
如果出于性能考虑想复用对象(比如大批量数据场景),可以在每次循环前重置dto的所有属性为默认值再执行复制,但这种方式容易遗漏属性重置,不如每次新建实例直观可靠。
内容的提问来源于stack exchange,提问作者Oscar Christiani
相关产品推荐
相关产品推荐

