MapStruct
Модуль позволяет интегрировать библиотеку MapStruct для преобразования классов между собой.
Подключение¶
Зависимость build.gradle
:
MapStruct в Kotlin работает с помощью kapt, по этому требуется также настроить плагин build.gradle.kts
:
Последняя рабочая версия для 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
:
Использование¶
Создание самих преобразователей ложится на библиотеку 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)
}
}