Mapstruct如何在字段完全相同的BO与DTO间实现无冗余转换?
解决MapStruct无冗余注解实现同字段类转换的问题
嘿,刚好对MapStruct这块熟得很,你的问题其实很容易解决——MapStruct本身就默认支持自动映射所有名称和类型完全匹配的字段,根本不需要加任何冗余的@Mapping注解!
你之前加的@Mapping(source = "qualificationId", target = "qualificationId")完全是多余的,甚至可以说没必要写。之所以你可能觉得需要加,大概率是之前处理字段差异类时养成的习惯,但对于字段完全一致的Qualification(BO)和QualificationRecord(DTO),只需要简单定义Mapper接口就行:
正确的Mapper写法
// 如果是Spring环境,加上componentModel = "spring"方便依赖注入 @Mapper(componentModel = "spring") public interface QualificationMapper { // 非Spring环境可以用这个静态实例直接调用 QualificationMapper INSTANCE = Mappers.getMapper(QualificationMapper.class); // BO转DTO:MapStruct自动映射所有同名同类型字段 QualificationRecord toQualificationRecord(Qualification qualification); // DTO转BO:同理自动完成全字段映射 Qualification toQualification(QualificationRecord qualificationRecord); }
为什么这就够了?
MapStruct的核心逻辑就是默认匹配同名同类型的属性,不管你的类有多少个字段,只要两个类里的字段名称、数据类型完全一致,它在生成实现类的时候就会自动为每个字段生成赋值代码。你可以去项目的target/generated-sources/annotations目录下查看生成的Mapper实现类,里面会清晰看到所有字段的映射逻辑,根本不需要你手动写@Mapping。
之前你可能因为字段差异的场景习惯了加@Mapping,但现在字段完全相同的情况下,这些注解都是冗余的,删掉反而让代码更简洁。
内容的提问来源于stack exchange,提问作者kshubham07
相关产品推荐
相关产品推荐

