首页 > 解决方案 > 无法使用 mapstruct 和 lombok @Value 和 @Builder 映射多个值,可与 @Data 一起使用

问题描述

我有一个看起来像这样的映射

@Mapper(componentModel = "spring") 
public interface CreateCdiMapper {
    CreateCdiMapper INSTANCE = Mappers.getMapper(CreateCdiMapper.class);


    @Mapping(source = "data.attributes.deviationShortDescription", target = "fields.summary")
    @Mapping(source = "included.genericDeviationId", target = "fields.deviationId")
    DeviationDto jsonToCreateJiraCdi(Deviation createDeviation);
}

使用 lomboks 使目标不可变@Value,并且还具有@Builder. 如果我注释掉任何一个字段,我的映射工作正常,即

//@Mapping(source = "data.attributes.deviationShortDescription", target = "fields.summary")
@Mapping(source = "included.genericBrandInternalReleation", target = "fields.deviationId")
DeviationDto jsonToCreateJiraCdi(Deviation createDeviation);

@Mapping(source = "data.attributes.deviationShortDescription", target = "fields.summary")
//@Mapping(source = "included.genericBrandInternalReleation", target = "fields.deviationId")
DeviationDto jsonToCreateJiraCdi(Deviation createDeviation);

两者都工作正常。我可以看到在生成的类中使用了 lomboks Builder。但是,如果我像上面的第一个示例一样不注释这两个映射,我会收到这些错误,说这两个字段都缺少写访问器。

"summary" has no write accessor in Fields for target name "fields.summary".
"deviationId" has no write accessor in Fields for target name "fields.deviationId"

我在我的 build.gradle

ext {
    springBootVersion = '2.4.2'
    mapstructVersion = "1.4.1.Final"
    lombokVersion = "1.18.16"
    lombokMapstructBindingVersion = "0.2.0"
}
implementation "org.mapstruct:mapstruct:${mapstructVersion}", "org.projectlombok:lombok:${lombokVersion}"
annotationProcessor "org.mapstruct:mapstruct-processor:${mapstructVersion}", "org.projectlombok:lombok:${lombokVersion}", "org.projectlombok:lombok-mapstruct-binding:${lombokMapstructBindingVersion}"

有人可以帮我理解为什么会这样吗?如果我删除@Valueand@Builder而是使用@Data,一切正常。

添加相关类

@Value
@Builder
public class Deviation{
    Fields fields;
}

@Value
@Builder
public class Fields {
    String summary;
    String deviationId;
}

标签: javalombokmapstruct

解决方案


推荐阅读