能否使用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
相关产品推荐
相关产品推荐

