2017-09-16 1 views
1

다중 모듈 Maven 기반 스프링 부트 응용 프로그램이 있습니다. 내 모듈의 'application.properties 파일 중 하나에서 잭슨을 으로 설정하지 않고을 타임 스탬프 (배열)로 날짜를 serialize하지 않으므로 항상 문자열 (대체 동작)으로 직렬화됩니다. 속성은 다음과 같습니다.스프링 부트 : Jackson이 "application.properties"에서 구성을 선택하지 않습니다.

spring.jackson.serialization.write_dates_as_timestamps=false 

문제는 ... 속성이 Spring Boot/Jackson에서 선택되지 않은 것 같습니다. serialize하려고 시도하는 java.time.LocalDate 인스턴스는 항상 타임 스탬프로 기록됩니다. 나는 (잭슨의 자신의 JavaTimeModule에서)를 LocalDateSerializer.serialize(...) 방법 내부의 코드를 확인하고,이를 발견 :

@Override 
public void serialize(LocalDate date, JsonGenerator generator, SerializerProvider provider) throws IOException 
{ 
    if (useTimestamp(provider)) { // This always returns true 
     generator.writeStartArray(); 
     generator.writeNumber(date.getYear()); 
     generator.writeNumber(date.getMonthValue()); 
     generator.writeNumber(date.getDayOfMonth()); 
     generator.writeEndArray(); 
    } else { 
     String str = (_formatter == null) ? date.toString() : date.format(_formatter); 
     generator.writeString(str); 
    } 
} 

useTimestamp() 방법에 관계없이 항상 내 구성이 무엇인지, 진정한 반환하지 않습니다. :(

답변

0

감사 인드라의 대답에, 나는 내 문제를 알아내는 데 도움 중요한 단서를 얻었다.

내 Spring Boot 응용 프로그램은 해당 응용 프로그램 컨텍스트에 RestTemplate의 여러 인스턴스가 있음을 알 수 있습니다 (상당히 큰 시스템이며 일부 사용자 정의 독점 프레임 워크가 작동하기를 원합니다). 대부분이 RestTemplate 인스턴스는 시스템의 아키텍처 . RestTemplate 예 : 을 작성했으며 내 비즈니스 로직이 작동하도록합니다 (내 시스템에서 원격 RESTful API를 사용하도록 설정).

그래서, 잭슨과의 ObjectMapper, 정말 영향을주지 않는 한 내RestTemplate 인스턴스를 구성하려고 할 때. 구성을 읽을 때까지, RestTemplate은 오래 전에 Spring Boot가 제공 한 기본 설정으로 초기화되었습니다.

@Configuration 
public class RestConfiguration { 

    @Bean 
    public RestTemplate myRestTemplate(HttpMessageConverters customConverters) { 
     RestTemplate restTemplate = new RestTemplate(); 
restTemplate.setMessageConverters(customConverters.getConverters()); 
     return restTemplate; 
    } 

    /* 
    * The following custom HttpMessageConverter is injected into myRestTemplate 
    * in order to appropriately configure the serialization/deserialization of LocalDate 
    * instances into/from strings. 
    */ 
    @Bean 
    public HttpMessageConverters customConverters() { 
     MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter(); 

     ObjectMapper mapper = new ObjectMapper(); 
     mapper.registerModule(new JavaTimeModule()); 
    mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false); 

     converter.setObjectMapper(mapper); 
     return new HttpMessageConverters(converter); 
    } 

} 

내가 뭐하는 거지하는 것은 명시 적으로 를 구성 할 필요 RestTemplate 예를을 구성하는 것입니다 :

이 내 최종 구성 클래스는 모습입니다.

다음 설명서도 매우 유용했습니다. HttpMessageConverters. 응용 프로그램 컨텍스트에서 사용하기 위해 사용자 지정 HttpMessageConverters를 선언하는 방법을 설명합니다.

1

은 어쩌면 당신은 사용자 정의 MappingJackson2HttpMessageConverterObjectMapper을 만들 수 있습니다. 여기에 예제 구성 클래스는,

@Configuration 
public class MyConfiguration extends WebMvcConfigurerAdapter { 
    @Bean 
    public MappingJackson2HttpMessageConverter 
     getMappingJacksonHttpMessageConverter() { 
     MappingJackson2HttpMessageConverter converter = 
      new MappingJackson2HttpMessageConverter(); 
     ... 

     ObjectMapper mapper = new ObjectMapper(); 
     ... 
     mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); 
     //or 
     // mapper.configure(
     // SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false); 

     converter.setObjectMapper(mapper); 
     return converter; 
    } 

} 
+0

WebMvcConfigurerAdapter를 확장해야합니까? – Enrique

+0

나는 위의 예에서 보여준대로 일을 해왔다. 'ObjectMapper'의 행동에 대한 더 많은 통제. –

+0

커스텀'HttpMessageConverter'를 생성하면 설정하려고했던'RestTemplate' 인스턴스에 명시 적으로 주입해야한다는 것을 알 수있었습니다. 내 결과를 자세히 설명하는 답변을 추가했습니다. :) – Enrique

관련 문제