【问题标题】:Swagger generated code date issue "Java 8 date/time type java.time.OffsetDateTime not supported by default"Swagger 生成代码日期问题“Java 8 日期/时间类型 java.time.OffsetDateTime 默认不支持”
【发布时间】:2022-10-18 22:15:36
【问题描述】:

我有从我在 SwaggerHub 中编码的 YAML API 定义文件生成的 SpringBoot Java(服务器存根)代码。我使用开放 API 3。

我无法让这个生成的代码工作,看起来很麻烦。

我无法修复的错误是这个:

com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Java 8 date/time type `java.time.OffsetDateTime` not supported by default: add Module "com.fasterxml.jackson.datatype:jackson-datatype-jsr310" to enable handling (through reference chain: io.swagger.v3.oas.models.OpenAPI["components"]->io.swagger.v3.oas.models.Components["schemas"]->java.util.TreeMap["CancelData"]->io.swagger.v3.oas.models.media.ObjectSchema["properties"]->java.util.TreeMap["dateStamp"]->io.swagger.v3.oas.models.media.DateTimeSchema["example"])
        at com.fasterxml.jackson.databind.exc.InvalidDefinitionException.from(InvalidDefinitionException.java:77) ~[jackson-databind-2.13.1.jar!/:2.13.1]
        at com.fasterxml.jackson.databind.SerializerProvider.reportBadDefinition(SerializerProvider.java:1300) ~[jackson-databind-2.13.1.jar!/:2.13.1]
        at com.fasterxml.jackson.databind.ser.impl.UnsupportedTypeSerializer.serialize(UnsupportedTypeSerializer.java:35) ~[jackson-databind-2.13.1.jar!/:2.13.1]
        

当我得到 API 文档 URL 时,我得到了它。

localhost:8080/.../api-docs

我尝试了所有可以在网上找到的建议,但没有任何帮助。

我认为这与我在 YAML 文件中的这个字段有关。

dateStamp:
      type: string
      format: date-time
      description: The creation date and time of this cancel transaction
      example: "2022-01-28T05:03:57Z"

我尝试注册 JavaTimeModule 以及网络上建议的所有内容。我不明白这个错误。我不知道即使我把它放在正确的地方。但这是我尝试过的修复。

@Bean
ObjectMapper objectMapper() {
    ObjectMapper objectMapper = new ObjectMapper();
    objectMapper.registerModule(new JavaTimeModule());
    return objectMapper;
}

我把它放在SwaggerDocumentationConfig

一般来说,我不明白为什么这个生成的代码有这么多错误。

https://github.com/FasterXML/jackson-modules-java8/issues/219
serialize/deserialize java 8 java.time with Jackson JSON mapper

我应该如何解决这个问题?

【问题讨论】:

    标签: java swagger openapi swagger-codegen


    【解决方案1】:

    我今天早些时候遇到了类似的问题。看着jackson-datatype-jsr310这个词,我遇到了https://geowarin.com/correctly-handle-jsr-310-java-8-dates-with-jackson/

    在其中,它建议添加

        compile 'com.fasterxml.jackson.datatype:jackson-datatype-jsr310'
    

    我用这个做的:

        implementation 'com.fasterxml.jackson.datatype:jackson-datatype-jsr310:+'
    

    然后在创建 ObjectMapper 时可以做的是替换

    @Bean
    ObjectMapper objectMapper() {
        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.registerModule(new JavaTimeModule());
        return objectMapper;
    }
    

    @Bean
    ObjectMapper objectMapper(Jackson2ObjectMapperBuilder objectMapperBuilder) {
        objectMapperBuilder.createXmlMapper(false).build();
        objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
        return objectMapper;
    }
    

    【讨论】:

      【解决方案2】:

      @Bean ObjectMapper 不起作用的原因是因为 swagger 不使用 Spring 上下文 bean,而是作为单例静态启动映射器。 因此,您可以通过以下方式获取此映射器并根据需要对其进行配置:

      io.swagger.util.Json.mapper().registerModule(new JavaTimeModule());
      

      在 swagger bean 初始化之前执行此操作。

      【讨论】:

        猜你喜欢
        • 2022-12-07
        • 2021-08-24
        • 1970-01-01
        • 2011-02-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-12-07
        • 1970-01-01
        相关资源
        最近更新 更多