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

zysjyyx4  于 2022-11-06  发布在  Java
关注(0)|答案(2)|浏览(285)

我有SpringBoot Java(服务器存根)代码从我在SwaggerHub中编码的YAML API定义文件生成。我使用Open 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]

我得到它时,我git的API文档的URL。
SwaggerDocumentationConfig
我尝试了所有我能在网上找到的建议,但没有任何帮助。
我认为这与我的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
我该如何解决这个问题?

vlju58qv

vlju58qv1#

今天早些时候,我遇到了类似的问题。
其中建议增加

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;
}
qvtsj1bj

qvtsj1bj2#

@BeanObjectMapper不工作的原因是swagger不使用Spring上下文bean,而是作为一个单例静态地自己启动Map器。因此,您可以通过调用以下命令获得此Map器并根据需要对其进行配置:

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

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

相关问题