分享一下我的开源项目 MapStructPlus,一个更好用的 Java Bean 模型转换工具

2024-01-18 18:06:55 +08:00
alva0  alva0

MapStructPlus

Mapstruct Plus 是 Mapstruct 的增强工具,在 Mapstruct 的基础上,实现了自动生成 Mapper 接口的功能,并强化了部分功能,使 Java 类型转换更加便捷、优雅。

和 Mapstruct 一样,本质上都是一个基于 JSR 269 的 Java 注释处理器,因此可以由 Maven 、Gradle 、Ant 等来构建触发。

Mapstruct Plus 内嵌 Mapstruct ,和 Mapstruct 完全兼容,如果之前已经使用 Mapstruct ,可以无缝替换依赖。


简单示例

假设有两个类 UserDto 和 User ,分别表示数据层对象和业务层对象:

public class UserDto {
    private String username;
    private int age;
    private boolean young;

    // getter 、setter 、toString 、equals 、hashCode
}
public class User {
    private String username;
    private int age;
    private boolean young;

    // getter 、setter 、toString 、equals 、hashCode
}

添加依赖: 引入 mapstruct-plus-spring-boot-starter 依赖:

<properties>
    <mapstruct-plus.version>1.3.6</mapstruct-plus.version>
</properties>
<dependencies>
    <dependency>
        <groupId>io.github.linpeilie</groupId>
        <artifactId>mapstruct-plus-spring-boot-starter</artifactId>
        <version>${mapstruct-plus.version}</version>
    </dependency>
</dependencies>
<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.8.1</version>
            <configuration>
                <source>1.8</source>
                <target>1.8</target>
                <annotationProcessorPaths>
                    <path>
                        <groupId>io.github.linpeilie</groupId>
                        <artifactId>mapstruct-plus-processor</artifactId>
                        <version>${mapstruct-plus.version}</version>
                    </path>
                </annotationProcessorPaths>
            </configuration>
        </plugin>
    </plugins>
</build>

指定对象映射关系

User 或者 UserDto 上面增加注解 —— @AutoMapper,并设置 targetType 为对方类。

例如:

@AutoMapper(target = UserDto.class)
public class User {
    // ...
}

测试

@SpringBootTest
public class QuickStartTest {

    @Autowired
    private Converter converter;

    @Test
    public void test() {
        User user = new User();
        user.setUsername("jack");
        user.setAge(23);
        user.setYoung(false);

        UserDto userDto = converter.convert(user, UserDto.class);
        System.out.println(userDto);    // UserDto{username='jack', age=23, young=false}

        assert user.getUsername().equals(userDto.getUsername());
        assert user.getAge() == userDto.getAge();
        assert user.isYoung() == userDto.isYoung();

        User newUser = converter.convert(userDto, User.class);

        System.out.println(newUser);    // User{username='jack', age=23, young=false}

        assert user.getUsername().equals(newUser.getUsername());
        assert user.getAge() == newUser.getAge();
        assert user.isYoung() == newUser.isYoung();
    }

}

小结

引入依赖后,使用 MapStructPlus 的步骤非常简单。

  1. 给需要转换的类添加 AutoMapper 注解;
  2. 获取 Converter 实例,调用 convert 方法即可。

该项目开发一段时间了,也逐渐趋于稳定,已在多个项目中正式应用,如果有帮助的话,求 star ~

2255 次点击
所在节点    Java
27 条回复
BQsummer
2024-01-19 10:48:50 +08:00
@taogen copyProperties 是运行时反射, MapStruct 是编译时, 性能差距很大
rockyastor
2024-01-19 10:49:29 +08:00
公司内是大量但不深度使用 mapstruct 的,这样一个 plus 库很实用,已 star !
alva0
2024-01-19 10:52:47 +08:00
@rockyastor 也是为了解决自己的痛点,开源出来的,感觉支持😁
zhazi
2024-01-19 11:33:06 +08:00
这个么一个小 kit 和整个 spring 生态做耦合,里面还塞了一个 hutool 的大杂烩,也没有测试
alva0
2024-01-19 11:42:52 +08:00
@zhazi 后面会考虑拆出来的
Aresxue
2024-01-19 13:16:50 +08:00
有对应的 idea 插件吗,当字段类型不一致时做提示(可配置为严格模式,严格模式直接报编译错误),还有两个实体的字段差异最好也能在悬浮窗上展现出来,感觉现有的 bean copy 在这方面都不咋的。
alva0
2024-01-19 13:55:23 +08:00
@Aresxue MapStruct 倒是有这个插件,我后面考虑开发一个

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1009758

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX