목차

SpringBoot and JSON

날짜 시간 처리 Date Time Format

기본 설정

WRITE_DATES_AS_TIMESTAMPS=false 사용

모든 타입에 대해 일관성 있는 커스텀 형식 지원

Jackson2ObjectMapperBuilder 사용시 Module 추가

@EnableWebMvc

@EnableWebMvcWebMvcConfigurerAdapter를 사용하는 순간 더이상 SpringBoot가 아니고 Spring 이기 때문에 위의 설정이 먹지 않게 된다. SpringBoot and Spring MVC 참조 Spring Boot Issue 2116

이때는 WebMvcConfigurerAdapter#configureMessageConverters를 override 해야한다.

@Configuration
@EnableWebMvc
public class WebConfig extends WebMvcConfigurerAdapter {
    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
       super.configureMessageConverters(converters);
       converters.add(new MappingJackson2HttpMessageConverter(jackson2ObjectMapperBuilder().build()));
    }
 
    @Bean
    public Jackson2ObjectMapperBuilder jackson2ObjectMapperBuilder() {
       return new Jackson2ObjectMapperBuilder()
               .failOnUnknownProperties(false) // SpringBoot default
               .featuresToDisable(MapperFeature.DEFAULT_VIEW_INCLUSION) // SpringBoot default
               .featuresToEnable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS) // SpringBoot default
               .serializerByType(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ISO_LOCAL_DATE_TIME))
               .serializerByType(LocalDate.class, new LocalDateSerializer(DateTimeFormatter.ISO_DATE));
    }
}

Controller Get Parameter 에 대한 포맷지원

이것은 Jackson JSON 직렬화와는 다른 문제이므로 포맷을 지정해야한다.

@GetMapping("/test")
public Result test(@RequestParam("datetime") @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) LocalDateTime datetime) {
    // ...
}
// 파라미터를 ?datetime=2018-07-11T20:22:55.123 형태로 호출

@JsonComponent

WebFlux Jackson 설정

@Configuration
public class Config implements WebFluxConfigurer, Jackson2ObjectMapperBuilderCustomizer {
    @Override
    public void customize(Jackson2ObjectMapperBuilder jacksonObjectMapperBuilder) {
        jacksonObjectMapperBuilder
                .featuresToDisable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS)
                .timeZone(TimeZone.getDefault())
                .locale(Locale.getDefault())
                .simpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX");
    }
}

기타 참조