Kotlin,mapstruct和生成的DTO错误“没有可访问的无参数构造函数”

问题描述

我正在尝试使用mapstruct在kotlin项目上转换复杂的dto。

mapstruct:1.3.1。最终 科特林:1.3.71 openapi生成器:4.2.3

例如,我想从一个简单的对象转换为TestObjectDTO

    @Mapping(source = "mydescription",target = "description")
    fun convertToDto(dto: TestObject): TestObjectDTO

我使用OpenApi生成我的DTO: yaml

components:
  schemas:
    TestObject:
      title: TestObject
      description: ''
      type: object
      properties:
        mode:
          type: string
        description:
          type: string
      required:
        - mode
        - description

生成的DTO

/**
 * 
 * @param mode 
 * @param description 
 */
data class TestObjectDTO (

        @get:NotNull 
        @JsonProperty("mode") var mode: kotlin.String,@get:NotNull 
        @JsonProperty("description") var description: kotlin.String
) {

}

一个总是有错误,因为我的构造函数不允许无参数。

您是否知道如何解决此问题?

解决方法

您可以使用@ObjectFactory手动实例化DTO类。问题是TestObjectDTO不接受空值,因此您将需要使用虚假值,

@Mapper
interface TestObjectMapper {

    @ObjectFactory
    fun createDto() = TestObjectDto("","")

    @Mapping(source = "mydescription",target = "description")
    fun convertToDto(dto: TestObject): TestObjectDto
}
,

1.3.1.Final不支持使用构造函数创建对象。如错误消息所述,您将必须定义一个不带参数的构造函数。

但是,您可以尝试1.4.0.Beta3,该版本增加了对使用构造函数的映射的支持。这适用于Kotlin数据类