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/

posted on 2025-12-27 08:00  荣锋亮  阅读(3)  评论(0)    收藏  举报

导航