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 的处理,推荐还是每个复杂字段类都有自己的映射,这样才能确保生成的代码不会有太大的问题
浙公网安备 33010602011771号