【问题标题】:Using MapStruct together with Lombok under QuarkusQuarkus下配合Lombok使用MapStruct
【发布时间】:2020-08-27 16:30:08
【问题描述】:

我在 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 热部署吗?我记得那里也有一些问题。 (常规)“maven clean install”然后运行 ​​quarkus 是否也会出现问题?
  • 一般问题是 Lombok 在处理现有类中的注释时会创建新的东西。根据 JSR269,这是不允许的。 MapStruct 面临的问题是等到 lombok 完成。 MapStruct 为 Lombok 应该调用的那个 (SPI) 创建了一个集成点。结帐:github.com/mapstruct/mapstruct/blob/master/processor/src/main/…
  • 我也遇到了同样的问题。不是 100% 确定是否是这个修复了它,但在我的 POM 中,我更改了构建插件部分下注释处理器的顺序,以便 Lombok 在 Mapstruct 之前。奇怪的是,它在那之后起作用了。

标签: java lombok quarkus mapstruct


【解决方案1】:

在我们的例子中,它与 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 源文件夹正在将生成的源和 mapstruct 实现添加到源路径。然后 mapstruct 处理器会尝试再次注册 mapstruct 源,这会导致冲突。

解决方案:我必须更具体地使用 add-sources 文件夹路径并排除 mapstruct 放置生成的 Java 类的文件夹。

【讨论】:

  • 这是经过多次尝试和寻找答案后最有价值/最有意义的答案。关于 annotationProcessorPaths 中路径的顺序,即使这对我也不起作用。
【解决方案2】:

感谢@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>

【讨论】:

    【解决方案3】:

    @the_quail 是对的,当我添加 org.codehaus.mojo 以自动生成来自 soap ws url 的存根时,我遇到了类似的问题。

    所以我更改了 generate-sources 的路径

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

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

    【讨论】:

      猜你喜欢
      • 2020-02-07
      • 2021-05-03
      • 1970-01-01
      • 2021-10-10
      • 2020-10-04
      • 1970-01-01
      • 1970-01-01
      • 2018-05-20
      • 2018-07-21
      相关资源
      最近更新 更多