MapStruct 2分钟示例

来自姬鸿昌的知识库
Jihongchang讨论 | 贡献2026年1月25日 (日) 04:53的版本
(差异) ←上一版本 | 最后版本 (差异) | 下一版本→ (差异)
跳到导航 跳到搜索

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>untitled</artifactId>
    <version>1.0-SNAPSHOT</version>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.18</version>
    </parent>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>

        <!-- Lombok 核心依赖 -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.30</version>
            <scope>provided</scope> <!-- 关键:仅编译期生效,不打入最终包 -->
        </dependency>
        
        <!-- 单元测试 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <!-- MapStruct 核心依赖 -->
        <dependency>
            <groupId>org.mapstruct</groupId>
            <artifactId>mapstruct</artifactId>
            <version>1.5.5.Final</version>
        </dependency>
        <!-- 编译期注解处理器 -->
        <dependency>
            <groupId>org.mapstruct</groupId>
            <artifactId>mapstruct-processor</artifactId>
            <version>1.5.5.Final</version>
            <scope>provided</scope>
        </dependency>

    </dependencies>

</project>

CarType.java

package org.example.common.enums;

public enum CarType {
    /**
     * 三厢轿车
     */
    SEDAN,
    /**
     * 运动型多用途汽车
     */
    SUV,
    /**
     * 皮卡:驾驶室+开放式货箱
     */
    PICKUP
}

Car.java

package org.example.domain;

import lombok.AllArgsConstructor;
import lombok.Data;
import org.example.common.enums.CarType;

@Data
@AllArgsConstructor
public class Car {

    private String make;

    private int numberOfSeats;

    private CarType type;
}

CarDTO.java

package org.example.model.dto;

import lombok.Data;

@Data
public class CarDTO {
    /**
     * 制造商
     */
    private String make;

    private int seatCount;

    private String type;
}

CarMapper.java

package org.example.converter.mapper;

import org.example.domain.Car;
import org.example.model.dto.CarDTO;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.factory.Mappers;

@Mapper
public interface CarMapper {

    CarMapper INSTANCE = Mappers.getMapper(CarMapper.class);

    @Mapping(source = "numberOfSeats", target = "seatCount")
    CarDTO carToCarDTO(Car car);
    
}

CarMapperTest.java

package org.example.converter.mapper;

import org.example.common.enums.CarType;
import org.example.domain.Car;
import org.example.model.dto.CarDTO;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;

public class CarMapperTest {

    @Test
    public void test() {
        Car car = new Car("宝马", 5, CarType.SEDAN);

        CarDTO carDTO = CarMapper.INSTANCE.carToCarDTO(car);

        Assertions.assertNotNull(carDTO);

        Assertions.assertEquals("宝马", carDTO.getMake());
        Assertions.assertEquals(5, carDTO.getSeatCount());
        Assertions.assertEquals(CarType.SEDAN.name(), carDTO.getType());

    }
}