如何使用MapStruct实现部分属性自定义映射,其余属性自动映射?
解决方案
完全可以实现,你不需要手动实现全字段的映射逻辑,MapStruct会自动处理名称匹配的字段,仅需要针对特殊字段单独配置自定义逻辑即可,常见有两种实现方式:
方案1:通过@Mapping的expression直接指定自定义逻辑
适合自定义逻辑比较简短的场景,直接在注解中关联你的自定义逻辑代码:
@Mapper(componentModel = "cdi") public interface MyMapper { MyMapper INSTANCE = Mappers.getMapper(MyMapper.class); // 仅显式指定需要自定义映射的字段,其余同名字段自动映射 @Mapping(target = "fieldRequiringCustomMapping", expression = "java(buildCustomMap(myEntity))") MyDto toDTO(MyEntity myEntity); // 单独抽离自定义映射的逻辑方法 default Map<String, Object> buildCustomMap(MyEntity myEntity) { // 此处写你原来的自定义逻辑,返回生成的map对象即可 Map<String, Object> map = new HashMap<>(); // 你的自定义处理逻辑 return map; } }
方案2:通过@AfterMapping后置处理补充特殊字段
适合自定义逻辑比较复杂,或者需要依赖已经映射好的其他DTO字段的场景:
@Mapper(componentModel = "cdi") public interface MyMapper { MyMapper INSTANCE = Mappers.getMapper(MyMapper.class); // 不需要加特殊配置,MapStruct先自动映射所有同名字段 MyDto toDTO(MyEntity myEntity); // 自动映射完成后,执行该后置方法补充自定义字段 @AfterMapping default void handleCustomField(MyEntity myEntity, @MappingTarget MyDto dto) { // 此处写你原来的自定义逻辑,生成map后赋值给DTO的对应字段 Map<String, Object> map = new HashMap<>(); // 你的自定义处理逻辑 dto.setFieldRequiringCustomMapping(map); } }
补充说明
两种方案下,后续你给MyEntity新增和MyDto名称匹配的字段时,不需要修改任何Mapper代码,MapStruct会自动完成新增字段的映射,不会再出现漏更的问题。
内容的提问来源于stack exchange,提问作者Tim
相关产品推荐
相关产品推荐

