Kora фреймворк для написания Java / Kotlin приложений с упором на производительность, эффективность, прозрачность сделанный разработчиками Т-Банк / Тинькофф

Kora is a framework for writing Java / Kotlin applications with a focus on performance, efficiency, transparency made by T-Bank / Tinkoff developers

Перейти к содержанию

MapStruct

Модуль позволяет интегрировать библиотеку MapStruct для преобразования классов между собой.

Подключение

Зависимость build.gradle:

annotationProcessor "org.mapstruct:mapstruct-processor:1.5.5.Final"
implementation "org.mapstruct:mapstruct:1.5.5.Final"

MapStruct в Kotlin работает с помощью kapt, по этому требуется также настроить плагин build.gradle.kts:

plugins {
    kotlin("kapt") version ("1.9.10")
}

Последняя рабочая версия для kapt + ksp является 1.9.10-1.0.13, в последующих версиях KSP совместимость между этими двумя инструментами сломали на уровне Gradle Plugin.

Надо разрешить использовать выходные данные kapt как входные для KSP build.gradle.kts:

ksp {
    allowSourcesFromOtherPlugins = true
}
tasks.withType<KspTask> {
    dependsOn(tasks.named("kaptKotlin").get())
    tasks.named("kaptGenerateStubsKotlin").get()
}

Успешная сборка приложения может быть только со второго раза, это особенности KSP.

Зависимость build.gradle.kts:

kapt("org.mapstruct:mapstruct-processor:1.5.5.Final")
implementation("org.mapstruct:mapstruct:1.5.5.Final")

Использование

Создание самих преобразователей ложится на библиотеку MapStruct, Kora в данном случае лишь предоставляет созданные библиотекой классы как зависимости в контейнер зависимостей.

@KoraApp
public interface Application {

    public enum CarType {TYPE1, TYPE2}

    public record Car(String make, int numberOfSeats, CarType type) { }

    public record CarTO(String make, int seatCount, String type) { }

    @Mapper
    public interface CarMapper {

        @Mapping(source = "numberOfSeats", target = "seatCount")
        CarTO map(Car car);
    }

    default SomeService someService(CarMapper carMapper) {
        return new SomeService(carMapper);
    }
}
@KoraApp
interface Application {

    enum class CarType { TYPE1, TYPE2 }

    data class Car(val make: String, val numberOfSeats: Int, val type: CarType)

    data class CarTO(val make: String, val seatCount: Int, val type: String)

    @Mapper
    interface CarMapper {

        @Mapping(source = "numberOfSeats", target = "seatCount")
        fun map(car: Car): CarTO
    }

    fun someService(carMapper: CarMapper): SomeService {
        return SomeService(carMapper)
    }
}