具有 3 种日期类型(LocalDate、LocalDateTime、ZonedDateTime)的 OpenAPI 生成器

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

我有一个使用 Spring 控制器手动编写的现有服务,我正在尝试使用 OpenAPI Generator 迁移到该服务。我遇到了以下阻塞问题:

  1. 服务器当前配置了返回 3 种不同日期类型的 API:
  • LocalDate
  • LocalDateTime
  • ZonedDateTime
  1. OpenAPI 规范支持两种日期类型/格式
  • date
  • date-time
  1. OpenAPI Generator Kotlin 默认为上述两种格式(分别)生成
    LocalDate
    OffsetDateTime
    。生成器可以配置为用
    OffsetDateTime
    替换
    ZonedDateTime
    ,例如:
typeMappings.set(mapOf("DateTime" to "ZonedDateTime"))
importMappings.set(mapOf("ZonedDateTime" to "java.time.ZonedDateTime"))
  1. 但是,对于返回
    LocalDateTime
    的现有 API,它们没有留下兼容的数据类型。它们必须配置为
    date
    (
    LocalDate
    ) 或
    date-time
    (
    ZonedDateTime
    ),对于期望并尝试反序列化
    LocalDateTime
    的客户端来说,这两种格式都没有兼容的有线格式。

我知道

LocalDateTime
对于 API 来说是一种不好的数据类型,因为它缺乏明确的时区,但这阻止了我将服务迁移到使用 OpenAPI Generator。我能想到的唯一解决方法是将
LocalDateTime
属性视为简单的
string
。有没有更好的解决方法可以让我继续使用
LocalDateTime

kotlin openapi openapi-generator openapi-generator-gradle-plugin
1个回答
0
投票

如果您的客户端预计很快会迁移到使用区域时间戳的 API,那么使用字符串可能是一个可行的临时选项。看来您正在通过 gradle 生成 openApi 代码。您可以使用两个单独的 gradle 任务从两个单独的 openApi 规范生成代码,每个规范都有其相关的 typeMappings/importMappings。例如:

tasks.register<GenerateTask>("generateCodeForZonedDateTime"){
    typeMappings.set(mapOf("DateTime" to "ZonedDateTime"))
    importMappings.set(mapOf("ZonedDateTime" to "java.time.ZonedDateTime"))
    modelPackage.set("com.example.codeforzoneddatetime")
    apiPackage.set("com.example.codeforzoneddatetime"
    inputSpec.set("openApiSpecWithEndpointsReturningZonedDateTime.yaml")
}

tasks.register<GenerateTask>("generateCodeForLocalDateTime"){
    typeMappings.set(mapOf("DateTime" to "LocalDateTime"))
    importMappings.set(mapOf("LocalDateTime" to "java.time.LocalDateTime"))
    modelPackage.set("com.example.codeforlocaldatetime")
    apiPackage.set("com.example.codeforlocaldatetime")
    inputSpec.set("openApiSpecWithEndpointsReturningLocalDateTime.yaml")
}

返回 ZoneDateTimes 的控制器将导入

com.example.codeforzoneddatetime

并且返回 LocalDateTimes 的控制器将从
导入代码
com.example.codeforlocaldatetime


如果您的客户准备只接受 ZonedDateTimes,您可以再次使用单个 openApi-spec 和单个GenerateTask。

© www.soinside.com 2019 - 2024. All rights reserved.