crowmagnumb
crowmagnumb

Reputation: 7137

Can't serialize java.time.LocalDate as a String with Jackson

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

Answers (4)

moraespaulolucas
moraespaulolucas

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

Madhu Bhat
Madhu Bhat

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

Dherik
Dherik

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

Denis Bazhenov
Denis Bazhenov

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

Related Questions