Spring Boot应用程序中Swagger2和jackson-datatype-jsr310之间的冲突

时间:2018-08-01 14:55:44

标签: spring-boot swagger-2.0 jsr310

我正在使用Spring Boot创建REST API,并且在使用Swagger 2时遇到了序列化LocalDateTime的问题。

没有Swagger,JSON输出是这样的:

{
    "id": 1,
    ...
    "creationTimestamp": "2018-08-01T15:39:09.819"
}

使用Swagger就像这样:

{
    "id": 1,
    ...
    "creationTimestamp": [
        2018,
        8,
        1,
        15,
        40,
        59,
        438000000
    ]
}

我已将其添加到pom文件中,因此日期可以正确序列化:

<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-jsr310</artifactId>
   </dependency>

这是Jackson的配置:

@Configuration
public class JacksonConfiguration {

    @Bean
    @Primary
    public ObjectMapper objectMapper(Jackson2ObjectMapperBuilder builder) {

        ObjectMapper objectMapper = builder.createXmlMapper(false).build();
        objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);

        return objectMapper;
    }
}

这是Swagger的配置:

@Configuration
@EnableSwagger2
public class SwaggerConfiguration extends WebMvcConfigurationSupport {

    @Bean
    public Docket messageApi() {
        return new Docket(DocumentationType.SWAGGER_2)
                .select()
                .apis(RequestHandlerSelectors.basePackage("com.xxx.message.controller"))
                .build()
                .apiInfo(metaData());
    }

    private ApiInfo metaData() {

        return new ApiInfoBuilder()
                .title("Message service")
                .version("1.0.0")
                .build();
    }

    @Override
    protected void addResourceHandlers(ResourceHandlerRegistry registry) {

        registry.addResourceHandler("swagger-ui.html")
                .addResourceLocations("classpath:/META-INF/resources/");

        registry.addResourceHandler("/webjars/**")
                .addResourceLocations("classpath:/META-INF/resources/webjars/");
    }
}

当我在DTO的字段中添加这样的反序列化器时,它可以工作。但是,它应该工作而不必添加它。

@JsonFormat(pattern = "dd/MM/yyyy")
@JsonDeserialize(using = LocalDateTimeDeserializer.class)
@JsonSerialize(using = LocalDateTimeSerializer.class)
private LocalDateTime creationTimestamp;

我想问题是Swagger有自己的对象映射器,该对象映射器覆盖了另一个。有解决办法的想法吗?

预先感谢

1 个答案:

答案 0 :(得分:0)

如我所见,当SwaggerConfiguration扩展WebMvcConfigurationSupport时出现问题。如果不需要,可以删除此扩展名。