MapStruct 无法使用带有自定义 setterPrefix 的 Lombok 构建器
MapStruct is unable to use Lombok's builder with custom setterPrefix
我开始将 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);
}
到目前为止我找到的唯一解决方案是:
- 为每个字段声明一个
@Mapping
;例如:@Mapping(source = "fieldName", target = "withFieldName")
― 挑战很大!
- 只从 Lombok 的
@Builder
注释中删除自定义 setterPrefix
当您使用非标准 属性 名称时,最好的方法是使用 Custom Accessor Naming Strategy.
使用它您可以定义如何从方法中提取 属性 名称。
我开始将 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);
}
到目前为止我找到的唯一解决方案是:
- 为每个字段声明一个
@Mapping
;例如:@Mapping(source = "fieldName", target = "withFieldName")
― 挑战很大! - 只从 Lombok 的
@Builder
注释中删除自定义setterPrefix
当您使用非标准 属性 名称时,最好的方法是使用 Custom Accessor Naming Strategy.
使用它您可以定义如何从方法中提取 属性 名称。