14

I set spring.jackson.serialization.WRITE_DATES_AS_TIMESTAMPS=false in the Spring Boot config but the Jackson serializer still produces [1942,4,2] instead of "1942-04-02" for a DateTime value.

Some debugging snapshots

  • In org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration.Jackson2ObjectMapperBuilderCustomizerConfiguration.StandardJackson2ObjectMapperBuilderCustomizer#customize there's

    configureFeatures(builder, this.jacksonProperties.getSerialization());

    which shows that "WRITE_DATES_AS_TIMESTAMPS" -> "false"

  • Then a bit later in org.springframework.http.converter.json.Jackson2ObjectMapperBuilder#configure there's this loop

    for (Object feature : this.features.keySet()) { configureFeature(objectMapper, feature, this.features.get(feature)); }

    and again this.features says "WRITE_DATES_AS_TIMESTAMPS" -> "false"

  • Yet during serialzation of a DateTime com.fasterxml.jackson.datatype.jsr310.ser.JSR310FormattedSerializerBase#useTimestamp says false because provider.isEnabled(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS) returns false.

Attempts at fixing

  • Out of despair I replaced spring.jackson.serialization.WRITE_DATES_AS_TIMESTAMPS=false with spring.jackson.serialization.write-dates-as-timestamps=false because I found that mentioned in a lot of places (even though the Boot documentation doesn't hint at this). What about this? They seem to be synonyms - no effect.
  • While writing this question SO suggested WRITE_DATES_AS_TIMESTAMPS not woking on Spring boot 1.3.5. The answer says to replace WebMvcConfigurationSupport with WebMvcConfigurerAdapter. While this does help indeed I fail to understand why so.
Marcel Stör
  • 22,695
  • 19
  • 92
  • 198

1 Answers1

21

Spring Boot takes the presence of a WebMvcConfigurationSupport bean as an indication that you want to take complete control of the configuration of Spring MVC. You'd typically end up with such a bean by using @EnableWebMvc but you could also declare your own bean or configuration class that is a WebMvcConfigurationSupport.

If you subclass WebMvcConfigurerAdapter rather than WebMvcConfigurationSupport you're making an additive change to Spring Boot's auto-configuration of Spring MVC rather than taking over completely.

Part of Spring Boot's auto-configuration of Spring MVC is to configure it to use the auto-configured ObjectMapper for HTTP message conversion. If you switch off Boot's auto-configuration of Spring MVC, it will use its own, separate ObjectMapper that is unaffected by any spring.jackson.* configuration settings.

Andy Wilkinson
  • 108,729
  • 24
  • 257
  • 242