芜湖市网站建设_网站建设公司_响应式开发_seo优化
2025/12/27 8:03:05 网站建设 项目流程

mapstruct多source 映射

mapstruct 是一个很不错高性能的DTO 映射工具,同时还支持与ioc 框架集成(实际上是生成兼容代码),mapstruct 不只支持简单得到类型映射,同时还是支持多source 到target 的映射配置的,但是在多source 的时候可能会有一些差异

参考场景

比如如下类

@Data
public class PluginConf {private  DbConfig dbConfig;private  WritePolicy writePolicy;private  User user;private  String version;private  String dbUser;private  String dbPassword;private  String dbUrl;private  String dbName;
}

其中的PluginConf 是有多个class 处理的,比如WritePolicy 通过WritePolicyDTO 进行映射

@Data
public class WritePolicy {private  String mode;private  int timeout;private  boolean durableDelete;
}

注意WritePolicyDTO 中的writeMode 应该映射为WritePolicy 的mode

@Data
public class WritePolicyDTO {private  String writeMode;private  int timeout;private  boolean durableDelete;
}

直接方法

@Mapper(componentModel = "spring", uses = {UserMapper.class
})
public interface PluginConfMapperv2 {@Mapping(source = "dbConfigDTO", target = "dbConfig")@Mapping(source = "writePolicy.writeMode", target = "writePolicy.mode")@Mapping(source = "user", target = "user")PluginConf toPluginConf(DbConfigDTO dbConfigDTO, WritePolicyDTO writePolicy, UserDTO user);
}

注意此时生成的代码并不太符合我们的需求,只会包含writePolicy.writeMode 的处理

解决方法

就是自己定义一个WritePolicyDTO 的映射,mapstruct 是足够只能的知道具体调用那个方法

@Mapper
public interface WritePolicyMapper {@Mapping(source = "writeMode", target = "mode")WritePolicy toWritePolicy(WritePolicyDTO writePolicyDTO);
}
@Mapper(componentModel = "spring", uses = {UserMapper.class,WritePolicyMapper.class
})
public interface PluginConfMapperv2 {@Mapping(source = "dbConfigDTO", target = "dbConfig")@Mapping(source = "user", target = "user")PluginConf toPluginConf(DbConfigDTO dbConfigDTO, WritePolicyDTO writePolicy, UserDTO user);
}

这样生成的代码就是符合我们期望的

说明

就是一个简单示例,核心是使用mapstruct,对于多source 的处理,推荐还是每个复杂字段类都有自己的映射,这样才能确保生成的代码不会有太大的问题

参考资料

https://mapstruct.org/documentation/stable/reference/html/

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询