【问题标题】:Consume Swagger API with multiple date-time formats使用具有多种日期时间格式的 Swagger API
【发布时间】:2018-10-29 08:36:06
【问题描述】:

我正在使用 Swagger 合同使用我无法控制的 API,使用 Swagger 代码生成 CLI Jar 版本 2.3.1 并使用 java8 日期库选项,语言也是 Java。

在 API 中有几个日期时间字段都定义为:

"type": "string",
"format": "date-time"

大多数值包括时区,但特别是一个不包括时区。因此,我们在以相同方式定义的字段中获取这两种格式:

"1963-08-15T23:59:59+02:00"
"1963-08-15T23:59:59"

这会导致反序列化器出现问题,因为它永远不知道要处理什么格式。

我在生成的 DTO 类中使用 OffsetDateTime,因为 LocalDateTime 不起作用 - 生成的代码不包含 Gson 适配器(请参阅 https://github.com/swagger-api/swagger-codegen/issues/6992)。

我曾尝试为反序列化器设置不同格式的格式化程序,但不起作用,主要是因为上面的第二种格式排除了区域信息:

ApiClient apiClient = new ApiClient();
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss[xxx]");
apiClient.setOffsetDateTimeFormat(dtf);

我希望不要过多地编辑生成的代码,因为我希望将来能够重新生成,并且我无法更改 API 返回的值,因为它是外部的。

有没有办法告诉生成的客户端将不同的格式反序列化为OffsetDateTime,或者将时区默认为特定的?

【问题讨论】:

    标签: java swagger


    【解决方案1】:

    我已通过编辑生成的JSON.java 文件并更改OffsetDateTimeTypeAdapter 类以在read 方法中的转换中使用ZonedDateTime 来解决此问题:

    return ZonedDateTime.parse(date, formatter).toOffsetDateTime();
    

    然后我将JSON.java 文件添加到.swagger-codegen-ignore 文件中。我怀疑该文件会经常更改。

    【讨论】:

      猜你喜欢
      • 2020-11-20
      • 1970-01-01
      • 1970-01-01
      • 2020-06-20
      • 1970-01-01
      • 1970-01-01
      • 2021-01-17
      • 1970-01-01
      • 2018-04-25
      相关资源
      最近更新 更多