【问题标题】:Kotlin, mapstruct and generated DTO error "does not have an accessible parameterless constructor."Kotlin、mapstruct 和生成的 DTO 错误“没有可访问的无参数构造函数”。
【发布时间】:2020-08-11 15:10:30
【问题描述】:

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

mapstruct:1.3.1.final 科特林: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
) {

}

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

你知道如何解决这个问题吗?

【问题讨论】:

    标签: kotlin mapstruct openapi-generator


    【解决方案1】:

    您可以使用@ObjectFactory 手动实例化 DTO 类。问题是TestObjectDTO 不接受空值,所以你需要使用虚拟值,这不是那么漂亮:

    @Mapper
    interface TestObjectMapper {
    
        @ObjectFactory
        fun createDto() = TestObjectDto("", "")
    
        @Mapping(source = "mydescription",  target = "description")
        fun convertToDto(dto: TestObject): TestObjectDto
    }
    

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 谢谢,我会试试 1.4.0.Beta3
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-02
      • 1970-01-01
      • 2019-10-02
      • 1970-01-01
      • 2021-06-06
      相关资源
      最近更新 更多