← Назад к вопросам

Как MapStruct и Lombok взаимодействуют

2.4 Senior🔥 121 комментариев
#Основы Java

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI29 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Взаимодействие MapStruct и Lombok

Основной концепт взаимодействия

MapStruct и Lombok — это две популярные Java-библиотеки, которые работают на уровне обработки аннотаций (annotation processing). Они отлично дополняют друг друга, хотя требуют правильной конфигурации для безконфликтного сосуществования.

MapStruct — это генератор маппинга объектов, который создаёт код преобразования между DTO и entity на этапе компиляции. Lombok — это библиотека для автогенерации бойлерплейт-кода (getters, setters, equals, hashCode, toString).

Проблема порядка обработки аннотаций

Главная сложность возникает с порядком обработки процессоров аннотаций. Оба инструмента используют javac для генерации кода, и если процессоры запустятся в неправильном порядке, MapStruct может попытаться использовать методы (getters/setters), которые Lombok ещё не сгенерировал.

Решение: явно указать порядок обработки в pom.xml или build.gradle:

<!-- Maven -->
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.30</version>
    <scope>provided</scope>
</dependency>

<dependency>
    <groupId>org.mapstruct</groupId>
    <artifactId>mapstruct</artifactId>
    <version>1.5.5.Final</version>
</dependency>

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.11.0</version>
    <configuration>
        <source>17</source>
        <target>17</target>
        <annotationProcessorPaths>
            <path>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <version>1.18.30</version>
            </path>
            <path>
                <groupId>org.mapstruct</groupId>
                <artifactId>mapstruct-processor</artifactId>
                <version>1.5.5.Final</version>
            </path>
        </annotationProcessorPaths>
    </configuration>
</plugin>

Практический пример

@Data
@Builder
public class UserEntity {
    private Long id;
    private String name;
    private String email;
}

@Data
@Builder
public class UserDto {
    private Long id;
    private String name;
    private String email;
}

@Mapper(componentModel = "spring")
public interface UserMapper {
    UserDto toDto(UserEntity entity);
    UserEntity toEntity(UserDto dto);
}

Lombok генерирует getters/setters, а MapStruct использует их для создания маппинг-методов. Важно: MapStruct может видеть только публичные методы, сгенерированные Lombok.

Рекомендации

  • Используй Gradle или Maven с явным указанием annotationProcessorPaths
  • В IDE (IntelliJ IDEA) включи обработку аннотаций: Settings → Build, Execution, Deployment → Compiler → Annotation Processors
  • Для Gradle используй плагин io.freefair.lombok
  • Тестируй чистой сборкой (clean compile), чтобы исключить кеш IDE

Это обеспечит корректное взаимодействие обеих библиотек и избежание конфликтов при генерации кода.

Как MapStruct и Lombok взаимодействуют | PrepBro