• MapStruct踩坑笔记


    MapStruct + Springboot 踩坑笔记

    在日常工作中经常遇到对象转换的问题,众所周知,利用反射的工具虽然很方便,但是在多次调用的情况下,性能会变得很低,反射代价太大,于是想尝试使用一下 MapStruct 工具

    准备

    MapStruct 官网

    MapStruct 快速入门

    第一步 工具引入

    我的工程是 SpringBoot 的 Maven 工程,引入依赖

    <dependency>
        <groupId>org.mapstructgroupId>
        <artifactId>mapstruct-processorartifactId>
        <version>1.5.2.Finalversion>
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    第二步 创建互相转换的对象

    @Data
    public class User {
    
        private Long id;
    
        private String name;
    
        private int age;
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    @Data
    public class UserDTO {
    
        private Long id;
    
        private String nickName;
    
        private int age;
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    第三步 创建转换类

    @Mapper(componentModel = MappingConstants.ComponentModel.SPRING, unmappedTargetPolicy = ReportingPolicy.IGNORE, unmappedSourcePolicy = ReportingPolicy.IGNORE)
    public interface UserMapping {
    
        @Mapping(target = "name", source = "nickName")
        User sourceToTarget(UserDTO userDTO);
    
        @Mapping(target = "nickName", source = "name")
        UserDTO targetToSource(User user);
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    第四步 编写测试用例

    @SpringBootTest
    class MybatisPlusApplicationTests {
    
        @Autowired
        private UserMapping userMapping;
    
        @Test
        void testMapping() {
            UserDTO userDTO = new UserDTO();
            userDTO.setId(123L);
            userDTO.setNickName("zuoxin");
            userDTO.setAge(10);
            System.out.println(userDTO);
            User user = userMapping.sourceToTarget(userDTO);
            System.out.println(user);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    本来这里就应该结束了,可是却报错了

    报错信息

    Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type ‘com.yczuoxin.mybatisplus.mapping.UserMapping’ available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoMatchingBeanFound(DefaultListableBeanFactory.java:1790)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1346)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1300)
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.resolveFieldValue(AutowiredAnnotationBeanPostProcessor.java:656)

    很明显,这个转换工具类应该被注入 Spring 容器的,但是并没有在 Spring 容器中找到,于是我去官网查看了资料,发现在 pom 文件中需要加入一段内容

    <properties>
        <org.mapstruct.version>1.5.2.Finalorg.mapstruct.version>
    properties>
    ...
    <dependencies>
        <dependency>
            <groupId>org.mapstructgroupId>
            <artifactId>mapstructartifactId>
            <version>${org.mapstruct.version}version>
        dependency>
    dependencies>
    ...
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.pluginsgroupId>
                <artifactId>maven-compiler-pluginartifactId>
                <version>3.8.1version>
                <configuration>
                    <source>1.8source>
                    <target>1.8target>
                    <annotationProcessorPaths>
                        <path>
                            <groupId>org.mapstructgroupId>
                            <artifactId>mapstruct-processorartifactId>
                            <version>${org.mapstruct.version}version>
                        path>
                    annotationProcessorPaths>
                configuration>
            plugin>
        plugins>
    build>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    再次跑测试用例

    java: 找不到符号
    符号: 方法 setAge(int)
    位置: 类型为com.yczuoxin.mybatisplus.entity.User的变量 user

    分析是加入之后 build 信息后,lombok 失效了,所以我在想,是不是这里导致 lombok 动态生成的类没地方放了,所以我改用增加依赖的方式解决了这个问题

    <dependency>
        <groupId>org.mapstructgroupId>
        <artifactId>mapstruct-processorartifactId>
        <version>1.5.2.Finalversion>
    dependency>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.pluginsgroupId>
                <artifactId>maven-compiler-pluginartifactId>
                <version>3.8.1version>
                <configuration>
                    <source>1.8source>
                    <target>1.8target>
                    <annotationProcessorPaths>
                        <path>
                            <groupId>org.mapstructgroupId>
                            <artifactId>mapstruct-processorartifactId>
                            <version>${org.mapstruct.version}version>
                        path>
                    annotationProcessorPaths>
                configuration>
            plugin>
        plugins>
    build>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    再次跑测试用例

    UserDTO(id=123, nickName=zuoxin, age=10)
    User(id=123, name=zuoxin, age=10)

    终于大功告成,在此记录,也方便有遇到类似问题的朋友顺利解决问题

  • 相关阅读:
    OPTEE:CA-TA会话的创建(二)
    天锐绿盾是干什么的?——防止公司内部核心文件数据资料外泄软件,图档加密 | 源代码加密、源码防泄露系统
    部分移动卡 无人接听时呼叫转移失败 问题分析
    LVS-DR模式 +keepalived
    太强了!GitHub大佬白嫖的SpringCloud微服务进阶宝典,啃完感觉能吊锤面试官!
    C/C++ 有 1 、 2 、 3 、 4 个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?
    【学生管理系统】整合JWT(完)
    面试秘籍 | 软件测试必备的mysql数据库技术
    数据可视化工具在成绩分析中的作用与意义
    2023/11/8JAVA学习
  • 原文地址:https://blog.csdn.net/ycxzuoxin/article/details/134430370