【问题标题】:Convert swagger format: date-time to LocalDateTime.class将 swagger 格式:日期时间转换为 LocalDateTime.class
【发布时间】:2021-10-05 20:45:32
【问题描述】:

我有一个无法更改的 swagger.json 规范。我正在使用swagger-codegen 从我的 swagger.json 创建一个库,如下所示:

$ java -jar swagger-codegen-cli.jar generate -i swagger.json -l java -o .

问题在于,在我的 swagger.json 中,一些格式被声明为 date-time 并且 codegen 将这些格式转换为 OffsetDateTime 类类型......但是我的服务请求的响应以 LocalDateTime 的形式出现,比如这个

{....,
"expirationDeadline": "2022-04-22T10:36:13.383",
....}

因此,当我使用该库并尝试将包含2022-04-22T10:36:13.383 的 JSONObject 反序列化为我的类时,它会失败,因为它无法将 2022-04-22T10:36:13.383 转换为 OffsetDateTime

最终经过一番搜索后,我关注了一些其他线程,例如 this one,我设法使用导入和类型映射将 OffsetDateTime 类型更改为 LocalDateTime

$ java -jar swagger-codegen-cli.jar generate \
-i updated-swagger.json \
-l java \
-o ./java-client-swagger-codegen/ \
--import-mappings org.threeten.bp.OffsetDateTime=org.threeten.bp.LocalDate \
--type-mappings OffsetDateTime=LocalDate

但现在的问题是 swagger-codegen 只创建带有 OffsetDateTimeTypeAdaperDateTypeAdapterLocalDateTypeAdapterSqlDateTypeAdapter 的 JSON 类,如下所示:

所以现在每当我尝试反序列化包含我的 LocalDateTime 格式的日期的对象时,我最终都会收到此错误:

serialize json java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 at $.expirationDeadline

到目前为止我尝试了什么:

  • 我让 codegen 将我的 date-time 格式转换为 OffsetDateTime,然后手动将 "expirationDeadline": "2022-04-22T10:36:13.383" 更改为 "expirationDeadline": "2022-04-22T10:36:13.383+01:00",它工作正常。
  • 我让 codegen 将我的 date-time 格式转换为 LocalDate,然后手动将 "expirationDeadline": "2022-04-22T10:36:13.383" 组合到 "expirationDeadline": "2022-04-22",它工作正常。
  • 生成库后,我手动创建了LocalDateTimeTypeAdapter,只是从另一个适配器复制了逻辑,现在可以了,我可以将预期的格式转换为LocalDateTime格式!

结论(实际求助)

不幸的是,我无法更改此格式,因此我假设我需要一种方法让我的swagger codegen 在运行命令时生成此LocalDateTimeTypeAdapter。我有什么论据可以让我的命令发生这种情况吗?谁能帮帮我?

【问题讨论】:

    标签: json swagger date-formatting swagger-codegen localdatetime


    【解决方案1】:

    不知道您是否找到了该问题的解决方案或其他解决方法,但对我有用的是在生成客户端时使用另一个库,因此 JSON 的解析将使用 Jackson 而不是 GSON 完成。

    https://github.com/swagger-api/swagger-codegen#customizing-the-generator

    在客户端生成脚本中,您应该例如添加以下参数以使用 feign 库:

        --library feign 
    

    如果有人在这里使用 OpenAPI 生成器遇到同样的问题,解决方案基本上是相同的 - 您应该使用其他一些库来使用 Jackson 解析器: https://openapi-generator.tech/docs/generators/java/

    【讨论】:

      猜你喜欢
      • 2016-11-26
      • 1970-01-01
      • 2017-12-09
      • 2015-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-28
      • 2019-02-25
      相关资源
      最近更新 更多