如何使用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
注意事项:
- 所有实体类必须有完整的getter/setter方法,Dozer依赖这些方法访问字段
- 如果是Maven项目,确保引入正确的Dozer依赖:
<dependency> <groupId>net.sf.dozer</groupId> <artifactId>dozer</artifactId> <version>5.5.1</version> <!-- 建议使用最新稳定版本 --> </dependency>
内容的提问来源于stack exchange,提问作者Ivancodescratch
相关产品推荐
相关产品推荐

