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

能否使用Dozer实现List<EntityDto>到List<UserDTO>的映射?

用Dozer实现List到List的映射

当然可以用Dozer搞定这个需求!Dozer本身就对集合映射有很好的支持,而且能灵活处理字段映射,完全适配你这种“从精简DTO映射到全量DTO”的场景。下面给你一步步讲怎么实现:

1. 先确保引入Dozer依赖

如果是Maven项目,在pom.xml里添加依赖(版本可以根据你的项目需求调整):

<dependency>
    <groupId>net.sf.dozer</groupId>
    <artifactId>dozer</artifactId>
    <version>5.5.1</version>
</dependency>

Gradle项目的话,对应添加:

implementation 'net.sf.dozer:dozer:5.5.1'

2. 配置字段映射(可选但推荐)

因为你的EntityDto只包含userId和name,而UserDTO有更多字段,Dozer默认会自动匹配同名字段进行映射——也就是说只要两个类里的userId、name字段名一致,不用额外配置也能完成这两个字段的映射,其他字段会保留默认值(比如null)。

如果想要更明确地控制映射规则(比如字段名不一致,或者要排除某些字段),可以用XML配置或者注解:

方式一:XML映射配置

创建一个dozer-mapping.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">
    <mapping>
        <class-a>com.yourpackage.EntityDto</class-a>
        <class-b>com.yourpackage.UserDTO</class-b>
        <!-- 明确指定要映射的字段,确保只有这两个字段被映射 -->
        <field>
            <a>userId</a>
            <b>userId</b>
        </field>
        <field>
            <a>name</a>
            <b>name</b>
        </field>
    </mapping>
</mappings>

然后初始化Dozer的时候加载这个配置:

List<String> mappingFiles = Arrays.asList("dozer-mapping.xml");
DozerBeanMapper mapper = new DozerBeanMapper(mappingFiles);

方式二:注解配置

如果不想写XML,可以用Dozer的注解直接在类上标注:
在EntityDto类上添加:

@Mapping(target = "userId", source = "userId")
@Mapping(target = "name", source = "name")
public class EntityDto {
    private Long userId;
    private String name;
    // getter、setter
}

不过这种方式需要确保Dozer启用了注解支持,初始化的时候可以设置:

DozerBeanMapper mapper = new DozerBeanMapper();
mapper.setMappingBuilder(new AnnotationMappingBuilder());

3. 执行集合映射

不管用哪种配置方式,最终的集合映射代码都很简单:

// 假设你已经拿到了EntityDto的列表
List<EntityDto> entityDtoList = userService.getEntityDtos();

// 初始化Dozer mapper(如果是Spring环境,可以把mapper配置成Bean注入使用)
DozerBeanMapper mapper = new DozerBeanMapper();
// 如果用了XML配置,就传入mappingFiles初始化

// 执行集合映射
List<UserDTO> userDtoList = mapper.map(entityDtoList, new TypeReference<List<UserDTO>>() {});

这样就能得到只填充了userId和name字段的UserDTO列表啦,其他字段会保持默认值。

另外提醒一下:如果是在Spring Boot项目里,也可以用dozer-spring-boot-starter来简化配置,直接注入DozerBeanMapper就行,不用手动初始化。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 10:46:22