JavaBean的对象转换器,mapstruct+lombok组合使用

吐槽一波

根据官方文档给出的教程,结合Lombok插件,出现不生成对应的impl实现类的问题,然后查阅了网上各方面的资料和ruoyi-pro具体的实现方法,在下面我将给出解决方法。

mapstruct是什么?能解决什么问题?

1、翻译一下官方文档资料,说明一下是什么东西!!!
MapStruct 是一个代码生成器,它基于配置方法的约定,极大地简化了 Java Bean 类型之间映射的实现。
生成的映射代码使用普通方法调用,因此快速、类型安全且易于理解。

2、能解决什么问题?
多层应用程序通常需要在不同的对象模型(例如实体和 DTO)之间进行映射。编写这样的映射代码是一项繁琐且容易出错的任务。MapStruct旨在通过尽可能自动化来简化这项工作。
与其他映射框架相比,MapStruct在编译时生成bean映射,这确保了高性能,允许快速的开发人员反馈和彻底的错误检查。

3、用起来怎么样?
MapStruct是一个注释处理器,它插入Java编译器,可以在命令行构建(Maven,Gradle等)以及您首选的IDE中使用。
MapStruct使用合理的默认值,但在配置或实现特殊行为时会让你不碍事。

总结一句话:mapstruct 是一个代码生成器,生成的代码实现了对象的转化,例如开发过程中entity转化成DTO对象。

4、各个对象转换方案对比

方案 优点 缺点
手写对象转换 1、操作灵活
2、便于之后的重构
1. 重复性工作多
2. 手写代码容易遗漏掉有些字段
BeanUtil.copy 1. 使用简单
2. Apache 的包效率比较低,spring 的包效率可以接受
1. 复杂场景支持不足,控制 copy 粒度太粗
2. 不易重构
mapstruct 1. 灵活性高支持简单,复杂,嵌套,自定义扩展等多种手段
2. 编译期生成,没有效率问题
不方便之后的重构

正文开始,来来来

  1. 引入pom依赖,并放上和Lombok配合使用出现问题的解决方案,少说废话,直接copy
 <dependencies>

        
        <dependency>
            <groupId>org.mapstructgroupId>
            <artifactId>mapstructartifactId>
        dependency>
        <dependency>
            <groupId>org.mapstructgroupId>
            <artifactId>mapstruct-jdk8artifactId>
            <version>1.5.3.Finalversion>
        dependency>
        <dependency>
            <groupId>org.mapstructgroupId>
            <artifactId>mapstruct-processorartifactId>
            <version>1.5.3.Finalversion>
        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.springframework.bootgroupId>
                            <artifactId>spring-boot-configuration-processorartifactId>
                            <version>2.7.8version>
                        path>
                        
                        <path>
                            <groupId>org.projectlombokgroupId>
                            <artifactId>lombokartifactId>
                            <version>1.18.24version>
                        path>
                        
                        <path>
                            <groupId>org.mapstructgroupId>
                            <artifactId>mapstruct-processorartifactId>
                            <version>1.5.3.Finalversion>
                        path>
                    annotationProcessorPaths>
                configuration>
            plugin>
        plugins>
    build>

2.entity类

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Car {
 
    private String make;
    private int numberOfSeats;
 
    //constructor, getters, setters etc.
}

3.对象映射类DTO

@Data
@AllArgsConstructor
@NoArgsConstructor
public class CarDto {
 
    private String make;
    private int seatCount;
 
    //constructor, getters, setters etc.
}

4.对象映射转化接口类Mapper
注意哈:如果项目中结合的mybatisORM框架,要注意@Mapper 引入的注解,是不是mapstruct的。

import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;

@Mapper 
public interface CarMapper {
 
    CarMapper INSTANCE = Mappers.getMapper( CarMapper.class ); 
 
    @Mapping(source = "numberOfSeats", target = "seatCount")
    CarDto carToCarDto(Car car); 
}

5.构建代码,build一下查看生成的impl,出现小箭头,就代表生成好了impl实体类
JavaBean的对象转换器,mapstruct+lombok组合使用_第1张图片

import javax.annotation.Generated;

@Generated(
    value = "org.mapstruct.ap.MappingProcessor",
    date = "2023-04-10T16:38:00+0800",
    comments = "version: 1.5.3.Final, compiler: javac, environment: Java 1.8.0_351 (Oracle Corporation)"
)
public class CarMapperImpl implements CarMapper {

    @Override
    public CarDto carToCarDto(Car car) {
        if ( car == null ) {
            return null;
        }

        CarDto carDto = new CarDto();

        carDto.setSeatCount( car.getNumberOfSeats() );
        carDto.setMake( car.getMake() );

        return carDto;
    }
}

你可能感兴趣的:(Maven,spring,boot,idea,maven,lombok,mapstruct)