代码之家  ›  专栏  ›  技术社区  ›  peter.petrov

Swagger生成的代码日期问题“默认情况下不支持Java 8日期/时间类型Java.time.OffsetDateTime”

  •  0
  • peter.petrov  · 技术社区  · 4 年前

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

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

    我无法修复的错误是:

    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

    总的来说,我不明白为什么生成的代码如此bug。

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

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

    0 回复  |  直到 4 年前
        1
  •  0
  •   Trec Apps    4 年前

    今天早些时候,我遇到了类似的问题。查看 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;
    }