在 Quarkus 下使用 MapStruct 和 Lombok

Using MapStruct together with Lombok under Quarkus

我在 MapStruct 博客上关注 the guide,但同时使用这 3 种技术时遇到了问题。 我一直在尝试 MapStruct 文档、错误报告、此处的帖子中的几种方法,但在每种情况下,我最终都会在构建过程中收到以下 异常。

有没有人在 Quarkus 下成功地将 MapStruct 与 Lombok 一起使用?感谢您的帮助。

奇怪的是,mvn clean 之后的第一个 compile 总是成功,而第二个 compile 或 运行 应用程序抛出这个:

Error:(9,8) java: Internal error in the mapping processor: java.lang.RuntimeException:
javax.annotation.processing.FilerException: Attempt to recreate a file for type com.example.service.RawContentDtoMapperImpl
at org.mapstruct.ap.internal.processor.MapperRenderingProcessor.createSourceFile(MapperRenderingProcessor.java:59)
at org.mapstruct.ap.internal.processor.MapperRenderingProcessor.writeToSourceFile(MapperRenderingProcessor.java:39)
...

映射器配置:

@MapperConfig(componentModel = "cdi")
    public interface QuarkusMappingConfig {
}

映射器:

@Mapper(config = QuarkusMappingConfig.class, unmappedTargetPolicy = ReportingPolicy.IGNORE)
public interface RawContentDtoMapper { 

    RawContentDTO toResource(RawContent rawContent);

}

在 pom.xml 中,我尝试了几种不同的方法,这些方法来自我为 MapStruct+Quarkus 和 MapStruct+Lombok 安排找到的所有指南。包括来自两个主要方法的相关部分:

共享属性

<properties>
        <compiler-plugin.version>3.8.1</compiler-plugin.version>
        <maven.compiler.parameters>true</maven.compiler.parameters>
        <maven.compiler.source>11</maven.compiler.source>
        <maven.compiler.target>11</maven.compiler.target>
       ...
        <org.mapstruct.version>1.4.0.Beta3</org.mapstruct.version>
        <org.projectlombok.version>1.18.12</org.projectlombok.version>
</properties>

1.使用插件 annotationProcessorPaths

<dependencies>
        <dependency>
            <groupId>org.mapstruct</groupId>
            <artifactId>mapstruct</artifactId>
            <version>${org.mapstruct.version}</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>${org.projectlombok.version}</version>
            <scope>provided</scope>
        </dependency>
</dependencies>

<build>
       <pluginManagement>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <version>3.8.1</version>
                    <configuration>
                        <source>${maven.compiler.source}</source>
                        <target>${maven.compiler.target}</target>
                        <annotationProcessorPaths>
                            <path>
                                <groupId>org.mapstruct</groupId>
                                <artifactId>mapstruct-processor</artifactId>
                                <version>${org.mapstruct.version}</version>
                            </path>
                            <path>
                                <groupId>org.projectlombok</groupId>
                                <artifactId>lombok</artifactId>
                                <version>${org.projectlombok.version}</version>
                            </path>
                        </annotationProcessorPaths>
                    </configuration>
                </plugin>
            </plugins>
        </pluginManagement>
</build>

2。使用 mapstruct-processor 依赖方法(使用和不使用方法 #1 中的 maven-compiler-plugin。以及使用和不使用 annotationProcessorPaths)

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

在我们的案例中,它与 Quarkus 无关,但与

    <plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>build-helper-maven-plugin</artifactId>
    <version>${build-helper-maven-plugin.version}</version>
    <executions>
        <execution>
            <id>add-generated-source</id>
            <phase>generate-sources</phase>
            <goals>
                <goal>add-source</goal>
            </goals>
            <configuration>
                <sources>
                    <source>${generated-sources-path}/wsdl</source>
                </sources>
            </configuration>
        </execution>
    </executions>
</plugin>

问题是我们的 add-source sourcefolder 正在将生成的源和 mapstruct 实现添加到源路径。然后 mapstruct-processor 将尝试再次注册 mapstruct 源,这将导致冲突。

解决方案:我必须更具体地使用 add-sources 文件夹路径并排除文件夹,其中 mapstruct 将生成的 Java 类.

感谢@jste89。 我只是反转注释处理器以使其工作

  <plugin>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>${compiler-plugin.version}</version>
    <configuration>
      <annotationProcessorPaths>
        <path>
          <groupId>org.projectlombok</groupId>
          <artifactId>lombok</artifactId>
          <version>1.18.80</version>
        </path>

        <path>
          <groupId>org.mapstruct</groupId>
          <artifactId>mapstruct-processor</artifactId>
          <version>1.4.2.Final</version>
        </path>
      </annotationProcessorPaths>
    </configuration>
  </plugin>

@the_quail 是对的 我在添加 org.codehaus.mojo 时遇到了类似的问题,以便从 soap ws url.

中自动生成存根

所以我更改了生成源的路径

${project.build.directory}/生成源

${project.build.directory}/generated-sources/wsdl