首页 > 解决方案 > MapStruct 无法使用带有自定义 setterPrefix 的 Lombok 构建器

问题描述

我开始MapStruct与现有Spring Boot应用程序(使用Lombok)集成。

问题是大多数类都遵循构建器模式(用 实现Lombok),但它们有一个自定义的setterPrefix. 我可以看到这MapStruct告诉我withXXX没有映射字段,但我想知道是否有解决方案。

这是设置:

plugins {
  id("io.freefair.lombok") // Notice how I'm using Lombok, so shifting dependencies is not an option
}

dependencies {
  annotationProcessor("org.mapstruct:mapstruct-processor:1.4.2.Final")
  annotationProcessor("org.projectlombok:lombok-mapstruct-binding:0.2.0")

  implementation("org.mapstruct:mapstruct:1.4.2.Final")

  ...
}

java {
  consistentResolution {
    useCompileClasspathVersions()
  }
  sourceCompatibility = JavaVersion.VERSION_11
  targetCompatibility = JavaVersion.VERSION_11
}

lombok {
  config["lombok.addLombokGeneratedAnnotation"] = "true"
  config["lombok.log.fieldIsStatic"] = "false"
  config["lombok.log.fieldName"] = "logger"
  version = "1.18.18"
}
@Setter
@Builder(setterPrefix = "with")
@EqualsAndHashCode(callSuper = false)
@AllArgsConstructor(access = AccessLevel.PRIVATE)
@NoArgsConstructor(access = AccessLevel.PUBLIC, force = true)
public final class Model {
  @Getter(onMethod = @__(@ColumnName("model_id")))
  private Long id;

  ...
}
@Mapper(componentModel = "spring", injectionStrategy = InjectionStrategy.CONSTRUCTOR)
interface ModelMapper {
  Model valueFrom(CreateModelCommand command);
}

到目前为止,我发现的唯一解决方案是:

标签: lombokmapstruct

解决方案


当您有非标准属性名称时,最好的方法是使用自定义访问器命名策略

使用它,您可以定义如何从方法中提取属性名称。


推荐阅读