You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 22:57:22