Mapstruct не работает с классами, в которых используется lombok

Mapstruct не может распознать поля (очевидно он не видит геттеры), указанные в аннотации @Mapping.

Мой код:

@Mapper(componentModel = "spring")
public interface CAndACodeGenConverter extends BaseConverter<CGen, AGen> {

    @Mapping(target = "owner", source = "owner.name")
    @Mapping(target = "useCA", source = "defaultCA")
    AGen convertToDto(CGen entity);
}

Зависимости в Gradle:

    mapstructVersion = "1.4.1.Final"
    lombokVersion = "1.18.12"
    lombokMapstructBindingVersion = "0.2.0"

    compileOnly('org.projectlombok:lombok:1.18.12')
    compile("org.mapstruct:mapstruct:${mapstructVersion}")
    implementation "org.mapstruct:mapstruct:${mapstructVersion}", "org.projectlombok:lombok:${lombokVersion}"
    annotationProcessor "org.mapstruct:mapstruct-processor:${mapstructVersion}", "org.projectlombok:lombok-mapstruct-binding:${lombokMapstructBindingVersion}"

Вот такую ошибку я получаю:

error: No property named "owner.name" exists in source parameter(s). Did you mean "null"?

Ответы (2 шт):

Автор решения: Vitaly Mironov

Попробуй написать зависимости в таком порядке:

compileOnly "org.projectlombok:lombok:$lombokVersion"
compileOnly "org.mapstruct:mapstruct:${mapstructVersion}"
annotationProcessor "org.projectlombok:lombok-mapstruct-binding:0.2.0"
annotationProcessor "org.mapstruct:mapstruct-processor:${mapstructVersion}"
annotationProcessor "org.projectlombok:lombok:$lombokVersion"

Я проверил - это должно работать.

P.S. Я не знаю, почему порядок тут что-то решает. Я узнал об этом в одной статье про lombok-mapstruct-binding, какой-именно не помню.

→ Ссылка
Автор решения: chitts

У меня заработало в такой конфигурации, без указания процессора в плагине.

    <mapStruct.version>1.4.2.Final</mapStruct.version>
    <lombok.version>1.18.4</lombok.version>

    <dependency>
        <groupId>org.mapstruct</groupId>
        <artifactId>mapstruct</artifactId>
        <version>${mapStruct.version}</version>
    </dependency>
    <dependency>
        <groupId>org.mapstruct</groupId>
        <artifactId>mapstruct-processor</artifactId>
        <version>${mapStruct.version}</version>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>${lombok.version}</version>
        <scope>provided</scope>
    </dependency>

    <plugin>
       <artifactId>maven-compiler-plugin</artifactId>
       <version>3.8.0</version>
    </plugin>
  • Когда версия Lombok, была 1.18.18 а версия MupStruct 1.4.2.Final не видело геттеры и сеттеры. Использую @Getter и @Setter а не @Data
  • c версией MupStruct 1.3.1.Final выдавало такое сообщение Supported source version 'RELEASE_6' from annotation processor 'org.mapstruct.ap.MappingProcessor' less than -source '1.8'

Java 8, Spring 5

конфигурация маппера такая

@Mapper(componentModel = "spring")

public interface EmployeeMapper {

EmployeeFullDto map(Employee employee);

Employee map(EmployeeFullDto employee);

List<EmployeeShortDto> map(List<Employee> list);

}

→ Ссылка