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

如何使用Dozer实现A.listAA到B.c.listCC的对象映射?

没问题,这就帮你搞定Dozer的嵌套集合映射!你要把A类里的listAA映射到B类内部C对象的listCC,其实两种常用配置方式都能轻松实现,我给你详细拆解:

方式一:XML配置文件(传统主流方式)

这种方式适合需要集中管理映射规则的场景,先定义单个对象的字段映射,再配置嵌套集合的路径关联:

<?xml version="1.0" encoding="UTF-8"?>
<mappings xmlns="http://dozer.sourceforge.net"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://dozer.sourceforge.net
          http://dozer.sourceforge.net/schema/beanmapping.xsd">

    <!-- 第一步:配置AA和CC的基础字段映射 -->
    <mapping>
        <class-a>com.yourpackage.AA</class-a>
        <class-b>com.yourpackage.CC</class-b>
        <field>
            <a>aa</a>
            <b>cc</b>
        </field>
    </mapping>

    <!-- 第二步:配置A到B的嵌套集合映射 -->
    <mapping>
        <class-a>com.yourpackage.A</class-a>
        <class-b>com.yourpackage.B</class-b>
        <!-- 用点语法指定嵌套目标路径:B的objectC属性下的listCC -->
        <field>
            <a>listAA</a>
            <b>objectC.listCC</b>
        </field>
    </mapping>

</mappings>

关键说明:

  • 先告诉Dozer怎么把单个AA对象转成CC对象(字段aa对应cc)
  • 再通过objectC.listCC这种点路径,直接把A的listAA集合映射到B内部C对象的listCC集合
方式二:注解+代码配置(代码优先场景)

如果不想写XML,用Dozer的注解和BeanMappingBuilder也能快速实现:

第一步:配置AA和CC的字段映射

public class AA {
    private String aa;

    // 用@Mapping注解指定对应CC的cc字段
    @Mapping("cc")
    public String getAa() {
        return aa;
    }

    // 别忘了setter方法,Dozer需要它来赋值
    public void setAa(String aa) {
        this.aa = aa;
    }
}

public class CC {
    private String cc;

    public String getCc() {
        return cc;
    }

    public void setCc(String cc) {
        this.cc = cc;
    }
}

第二步:构建映射器并配置A到B的嵌套映射

// 初始化Dozer映射器
DozerBeanMapper mapper = new DozerBeanMapper();
// 添加自定义映射规则
mapper.addMapping(new BeanMappingBuilder() {
    @Override
    protected void configure() {
        // 确认AA到CC的字段映射(如果已经用注解,这一步也可以省略,不过显式配置更清晰)
        mapping(AA.class, CC.class)
                .fields("aa", "cc");
        
        // 配置A到B的嵌套集合映射
        mapping(A.class, B.class)
                .fields("listAA", "objectC.listCC");
    }
});

// 实际使用示例
A sourceA = new A();
// 给sourceA的listAA填充测试数据
List<AA> aaList = new ArrayList<>();
aaList.add(new AA() {{ setAa("test1"); }});
aaList.add(new AA() {{ setAa("test2"); }});
sourceA.setListAA(aaList);

// 执行映射
B targetB = mapper.map(sourceA, B.class);
// 此时targetB.getObjectC().getListCC()里会有两个CC对象,cc字段分别是test1和test2

注意事项:

  1. 所有实体类必须有完整的getter/setter方法,Dozer依赖这些方法访问字段
  2. 如果是Maven项目,确保引入正确的Dozer依赖:
<dependency>
    <groupId>net.sf.dozer</groupId>
    <artifactId>dozer</artifactId>
    <version>5.5.1</version> <!-- 建议使用最新稳定版本 -->
</dependency>

内容的提问来源于stack exchange,提问作者Ivancodescratch

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 04:15:24