如何抑制Openapi 3.0生成器(gradle)生成某些模型DTO,并用导入映射代替?

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

我在 Kotlin 中有 Spring 支持的服务,我想在其中使用根据 OpenAPI 3.0 规范生成的接口和模型 DTO。

但是问题来了:使用Spring分页功能的服务,提供了从请求参数(page=0&size=10&sort=[id])到特殊对象Pageable(org.springframework.data.domain.Pageable)的映射

我仍然需要为非 Spring 客户端提供该对象的描述。 它在 yaml 中定义为 Pageable。

Pageable:
  type: object
  properties:
    page:
      type: integer
      format: int32
      default: 0
    size:
      type: integer
      format: int32
      default: 10
    sort:
      type: array
      items:
        type: string
      default: ["id"]

但是在服务器代码中,我想使用Spring原生对象,包括生成的接口定义。

在 Gradle 任务参数中,我使用导入映射将 api-spec 对象替换为 Spring 数据对象:

importMappings.put("Pageable", "org.springframework.data.domain.Pageable")

因此,接口定义使用正确的类(来自 Spring,而不是生成)。 但是DTO类仍然在目录中生成,并且有奇怪的名称“data class org.springframework.data.domain.Pageable”

data class org.springframework.data.domain.Pageable(

  @Schema(example = "null", description = "")
  @get:JsonProperty("page") val page: kotlin.Int? = 0,

  @Schema(example = "null", description = "")
  @get:JsonProperty("size") val propertySize: kotlin.Int? = 10,

  @Schema(example = "null", description = "")
  @get:JsonProperty("sort") val sort: kotlin.collections.List<kotlin.String>? = arrayListOf("id")

这是错误的,它会导致编译错误,所以我需要删除这个生成的文件以使整个项目可以编译。 有没有办法告诉 openapi 生成器不生成某些文件? 另外,typeMapping 和 importMapping 有什么区别?我认为第一个替换了 type (类名) ,第二个替换了仅导入引用。但事实上,importMapping 两者兼而有之,从而产生了不必要的副作用。

spring kotlin gradle openapi
1个回答
0
投票

除了

importMappings
之外,您还应该在此用例中使用
schemaMappings
。这告诉生成器,您的 OAS 中的模式
Pageable
对应于
org.springframework.data.domain.Pageable
并且不需要生成。

  • schemaMappings:将 OpenAPI 模式类型(例如日期时间)映射到特定语言类型(例如 java.time.LocalDateTime)。它控制 OpenAPI 数据类型如何在生成的代码中转换为特定于语言的类型。
  • importMappings:控制生成代码中使用的类型的完全限定名称 (FQN)。它确保生成的代码包含外部或特定类型的正确导入语句。
© www.soinside.com 2019 - 2024. All rights reserved.