mapstruct-kotlin-builder-generator
Library for generating builders for data classes, that are used in Mapstruct mappers as return types.
The problem
In Kotlin the following code produces 2 constructors from perspective of Java, default one and with a parameters:
data class Example(
val prop1: String? = null,
val prop2: String? = null
)
According
to Mapstruct documentation,
mapstruct always prefers a default constructor. And since properties declared as val
,
they cannot be reassigned.
There is known mapstruct issue #2378 and some possible workarounds:
- you can use
@Default
annotation to mark non-empty constructor - mark properties as
var
so Mapstruct can reassign them - don't use default values in constructors
- explicitly define default constructor as private
But such solutions will make your code a little messy. And sometimes you cannot apply any of these solutions, because your data classes are generated by third-party tools as dgs-codegen or jooq.
The solution
According to the documentation Mapstruct supports mapping of immutable types via builders, and you can implement your custom builder provider logic.
So my solution generates builders at compile time for data classes, that are used in Mapstruct mappers as return types.
Partly inspired by https://github.com/Pozo/mapstruct-kotlin.
The usage
First apply kapt plugin
plugins {
id "org.jetbrains.kotlin.kapt" version "1.6.21"
}
Then add these to your project as dependency:
kapt("io.github.olxmute:mapstruct-kotlin-builder-generator:0.0.2")