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/