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);
}