MapStruct 在更新 Entity 或 DTO 类后不会重新生成映射器

问题描述 投票:0回答:1

我正在编写一个 Spring Boot REST 应用程序 (Java 17)。为了将我的类从 Entity 映射到 DTO 以及反向映射,我使用 MapStruct 库(v 1.6.2)。为了实现 DTO,我使用 java 记录。为了在实体类中生成 getter 和 setter,我使用 Lombok (v 1.18.34)。我使用 Maven 作为项目构建系统。

MapStruct 成功生成正确的映射器并将其存储在 target/ generated-sources 目录中。但是生成映射器后,当我更新 DTO 实体(例如重命名字段)时,MapStruct 不会更新生成的映射器。因此,我必须在每次更新 DTO 类实体后删除生成的映射器,以便让 MapStruct 再次生成它们。是否有任何可能的解决方案来解决此问题或自动化再生过程?

我想问题可能出在 MapStruct 或 Maven 编译器插件配置中。这是我的配置:

<properties>
    <java.version>17</java.version>
    <maven-compiler-plugin.version>3.13.0</maven-compiler-plugin.version>
    <mapstruct.version>1.6.2</mapstruct.version>
    <lombok.version>1.18.34</lombok.version>
</properties>

<dependencies>
    <dependency>
        <groupId>org.mapstruct</groupId>
        <artifactId>mapstruct</artifactId>
        <version>${mapstruct.version}</version>
    </dependency>

    <dependency>
        <groupId>org.mapstruct</groupId>
        <artifactId>mapstruct-processor</artifactId>
        <version>${mapstruct.version}</version>
        <scope>provided</scope>
    </dependency>

    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>${lombok.version}</version>
    </dependency>
</dependencies>
<plugins>
    <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
        <configuration>
            <excludes>
                <exclude>
                    <groupId>org.projectlombok</groupId>
                    <artifactId>lombok</artifactId>
                </exclude>
            </excludes>
        </configuration>
    </plugin>

    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>${maven-compiler-plugin.version}</version>
        <configuration>
            <source>${java.version}</source>
            <target>${java.version}</target>
            <annotationProcessorPaths>
                <!-- Order is important! Lombok first! -->
                <path>
                    <groupId>org.projectlombok</groupId>
                    <artifactId>lombok</artifactId>
                    <version>${lombok.version}</version>
                </path>
                <path>
                    <groupId>org.mapstruct</groupId>
                    <artifactId>mapstruct-processor</artifactId>
                    <version>${mapstruct.version}</version>
                </path>
            </annotationProcessorPaths>
        </configuration>
    </plugin>
</plugins>

我目前使用的方法是手动删除 target/ generated-sources 目录。我还知道 Intellij IDEA 的一个功能,即在应用程序启动之前运行任务(例如

mvn clean
),但它会减慢启动速度。

我希望 MapStruct 在更新实体或 DTO 类后自动更新生成的映射器。

java maven lombok mapstruct
1个回答
0
投票

在您的 pom 中,无需将

mapstruct-processor
也放入
<dependency>
部分,将其放在
<annotationProcessorPaths>
下就足够了。另外,将 lombok 的
<scope>optional</scope>
<scope>provided</scope>
放入依赖项中。

可以在这里找到结合lombok和mapstruct的示例(https://github.com/mapstruct/mapstruct-examples/blob/main/mapstruct-lombok/pom.xml),这些源由mapstruct维护开发组,因此他们可能被视为“官员”。检查该 pom 并了解如何包含

lombok-mapstruct-binding
以增强兼容性。

无论如何,与其说这是一个 Maven 问题,不如说它更像是一个 IDE 问题(IntelliJ,对吧?)。请检查 IDE 控制台中是否有任何警告或错误,这些警告或错误可能会向您提供生成代码的自动更新中不起作用的证据。

© www.soinside.com 2019 - 2024. All rights reserved.