@Value - lombok 和 mapstruct 到另一个 @value 对象

@Value - lombok and mapstruct to another @value object

当我将 JSON Lombok @Value DTO 映射到 JPA @Value 实体 class 时,反之亦然,编译抛出异常。

"does not have an accessible parameterless constructor"

Java 11、hibernate、spring boot 5、Lombok 和 map struct 1.3.1 正在使用中。

使用的 MapStruct 版本需要一个 parameterless/no-argument 构造函数(c.f https://github.com/mapstruct/mapstruct/issues/73)。

您需要使用 MapStruct 版本 1.4.0.Beta1;或者创建一个无参数的构造函数并且不使用@Value。

修改 Maven/Gradle 文件中注释处理器路径的顺序可解决该问题。只要确保 Lombok 应该在 Mapstruct 之后。

使用Gradle:

dependencies {
  ...
  annotationProcessor("org.mapstruct:mapstruct-processor")
  annotationProcessor("org.projectlombok:lombok") <<=== Lombok after mapstruct
  ...
}

使用 Maven:

<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>

      <useIncrementalCompilation>false</useIncrementalCompilation>

      <annotationProcessorPaths>
        <path>
            <groupId>org.mapstruct</groupId>
            <artifactId>mapstruct-processor</artifactId>
            <version>${mapstruct-version}</version>
        </path>
        <path>
            <groupId>org.projectlombok</groupId>   <<=== Lombok after Mapstruct
            <artifactId>lombok</artifactId>
            <version>${lombok-version}</version>
        </path>
      </annotationProcessorPaths>

  </configuration>

<plugin>

我会在您的 class 之前添加以下 Lombok 注释:

@Value( staticConstructor = "of" )
@With
@Builder

此外,如果您希望 Lombok 为所有 @Value 注释的 classes 添加一个 no-args 构造函数,您需要添加进入你的 lombok.config 文件:

lombok.noargsconstructor.extraprivate=true