Setting Jackson feature WRITE_DATES_AS_TIMESTAMPS not working in Spring Boot
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.
Marcel Stör
Passionate clean coder, leading by example, from Switzerland. created first web site in 1997 been working with Java/Kotlin and web technologies since 1999 very much into IoT as well these days collaborator with the NodeMCU team on GitHub running nodemcu-build.com providing Docker NodeMCU build image providing NodeMCU PyFlasher to flash binaries to ESP8266, ESP8285 and ESP32 Co-founder of
Updated on June 11, 2022Comments
-
Marcel Stör almost 2 years
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 aDateTime
value.Some debugging snapshots
-
In
org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration.Jackson2ObjectMapperBuilderCustomizerConfiguration.StandardJackson2ObjectMapperBuilderCustomizer#customize
there'sconfigureFeatures(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 loopfor (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 becauseprovider.isEnabled(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS)
returns false.
Attempts at fixing
- Out of despair I replaced
spring.jackson.serialization.WRITE_DATES_AS_TIMESTAMPS=false
withspring.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
withWebMvcConfigurerAdapter
. While this does help indeed I fail to understand why so.
-
-
Stanislau Listratsenka over 2 yearsTo clarify, you should remove
@EnableWebMvc
annotation too. It solved my issue