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

问题描述 投票:0回答:3

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

映射结构: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
3个回答
0
投票

您可以使用@ObjectFactory手动实例化DTO类。问题是

TestObjectDTO
不接受空值,因此您需要使用虚拟值,这不太漂亮:

@Mapper
interface TestObjectMapper {

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

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

0
投票

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

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


0
投票

Java

一个可能的解决方案是使用 @NoArgsConstructor 注解 dto 类,例如:

@NoArgsConstructor
public class MyClass {
    private String myString;
    private Int myInt;
}
© www.soinside.com 2019 - 2024. All rights reserved.