⚠️ Since 1.4 MapStruct has support for using constructor arguments when instantiating mapping targets. This also works with Kotlin data classes.
Since mapstruct 1.3.0.Beta2 it's possible to use builders for immutable classes. According to the documentation you can implement your custom builder provider logic. This project take advantage of this and provide a custom BuilderProvider
for kotlin data classes.
So instead of this (source)
data class PersonDto(var firstName: String?, var lastName: String?, var phone: String?, var birthdate: LocalDate?) {
// Necessary for MapStruct
constructor() : this(null, null, null, null)
}
We can do this
@KotlinBuilder
data class PersonDto(val firstName: String, val lastName: String, val phone: String, val birthdate: LocalDate)
With a mapper
@Mapper
interface PersonMapper {
fun map(person: Person): PersonDto
}
First apply kapt plugin
apply plugin: 'kotlin-kapt'
Then add these to your project as dependency
api("com.github.pozo:mapstruct-kotlin:1.3.1.2")
kapt("com.github.pozo:mapstruct-kotlin-processor:1.3.1.2")
Check out the directory example
for a basic usage example.
For example in case of 1.3.1.1
the first part 1.3.1
is the mapstruct version number and the last digit 1
reserved for future patches.
mapstruct-kotlin-builder
contains only theKotlinBuilder
annotationmapstruct-kotlin-processor
responsible for generating the builders for the kotlin data classes with the help of a customDefaultBuilderProvider
example
responsible for demonstrating this library usage
./gradlew -p example clean build
Map with custom types are not workingLook over kotlin-builder-annotation project and replace with class generating module (builder-processor)Writing testsVersioning and release process
Please see LICENSE file
Zoltan Polgar - [email protected]
Please do not hesitate to contact me if you have any further questions.