【发布时间】: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