Reputation: 7137
I am using spring-boot 1.2.1.RELEASE with jackson 2.6.2 including the jsr310 datatype. I am using the annotation @SpringBootApplication to kick off my Spring app. I have
spring.jackson.serialization.write_dates_as_timestamps = false
set in my application.properties (which I know is being read because I tested with banner = false).
And yet java.time.LocalDate is still being serialized as an array of integers. I am not using @EnableWebMvc.
It looks like if I add the tag
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern="yyyy-MM-dd")
to my LocalDate variable then it works. But I thought it was automatic with the above property set. Plus, if I remember right (I've since just decided to work with the integer array), that only worked with serialization and not deserialization (but I can't honestly quite remember if that last part is true).
Upvotes: 10
Views: 18595
Reputation: 81
Here is what I did in my WebConfig.java:
@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
// other configs
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
WebMvcConfigurer.super.extendMessageConverters(converters);
converters.add(new MappingJackson2HttpMessageConverter(
new Jackson2ObjectMapperBuilder()
.dateFormat(new StdDateFormat())
.featuresToDisable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS)
.build()));
}
}
Upvotes: 0
Reputation: 15253
I had the same problem of LocalDateTime
being serialized as an array of integers like [2019,10,14,15,7,6,31000000]
. The spring boot version I had was 1.5.13.RELEASE
. I had to register the JavaTimeModule
on the ObjectMapper
being used to solve this. Below is my ObjectMapper
config that worked for me:
@Bean
public ObjectMapper getObjectMapper() {
ObjectMapper mapper = new ObjectMapper();
mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
mapper.registerModule(new JavaTimeModule());
return mapper;
}
Upvotes: 3
Reputation: 19120
This problem happened to me in a weird way... using different spring profiles, one of them returned an array of integers and the another returned the expected result (year-month-day).
After review my configuration, the problem was the lack of @Configuration
and (maybe) the @Primary
in my class... This is not explain why could be work in different profiles, but this follow setting resolved my problem:
@Configuration
public class WebConfigurer {
@Bean
@Primary
public ObjectMapper objectMapper(Jackson2ObjectMapperBuilder builder) {
ObjectMapper objectMapper = builder.build();
objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
return objectMapper;
}
}
And, of course, you still need the dependency for JSR 310 in the pom.xml.
Upvotes: 0
Reputation: 9965
This is know issue in Spring Boot. You need to do it manually.
objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
or update to 1.2.2.
UPDATE:
Also there is a way to configure ObjectMapper
used by spring from your container.
Upvotes: 10