2017-12-21 1 views
0

JSON 페이로드를 반환하는 Spring Boot를 사용하여 REST 서비스를 만들 때 Java 8의 LocalDateTime이 직렬화됩니다. (아마도) Jackson이 객체를 문자열로 정렬 할 때 적용되는 형식 문자열 (즉, 패턴)은 어디에 있으며, 그 형식을 적용하는 (즉, 포매터를 설정하는) Spring Boot의 기본 구성을 어디에서 찾을 수 있습니까?스프링 부트는 기본 JSON 날짜 (즉, LocalDateTime) 형식을 어디에 정의합니까?

(NB : 나는 페이로드에, 포맷 된 날짜가 아닌 타임 스탬프를 볼 수 있습니다.)

+2

LocalDateTime은 타임 스탬프가 아니므로 타임 스탬프가 표시되지 않는 것이 좋습니다. 즉, 문서에 질문에 대한 답변이 나와 있습니다. https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#howto-customize-the-jackson-objectmapper –

+0

문서에서 [Jackson2ObjectMapperBuilder '] (http://grepcode.com/file/repo1.maven.org/maven2/org.springframework/spring-web/4.1.1.RELEASE/org/springframework/http/converter/json/Jackson2ObjectMapperBuilder.java#460), 차례로 ['JSR310Module'] (http://grepcode.com/file/repo1.maven.org/maven2/com.fasterxml.jackson.datatype/jackson-datatype-jsr310/2.4.4/com을 가리킨다. /fasterxml/jackson/datatype/jsr310/JSR310Module.java#129) ... via – Christian

+0

... ['LocalDateTimeSerializer'] (http://grepcode.com/file/repo1.maven.org/maven2/com. 마지막으로 ['LocalDateTime :: toString'] (http : // grepcode)를 사용하여 quickxml.jackson.datatype/jackson-datatype-jsr310/2.4.4/com/fasterxml/jackson/datatype/jsr310/ser/LocalDateTimeSerializer.java # 69) .com/file/repository.grepcode.com/java/root/jdk/openjdk/8u40-b 25/java/time/LocalDateTime.java # 1965). 내 LocalDateTime은'1776-07-04T12 : 29Z'로 설정되어 있지만'1776-07-04T12 : 29 : 00Z'이됩니다. 문서는 "사용 된 형식이 가장 짧을 것입니다. 생략 된 부분은 0으로 암시됩니다": uuuu-MM-dd'T'HH : mm'. 나는': 00'을 왜 돌려 받는가? – Christian

답변

0

Jackson2ObjectMapperBuilder 수행 꽤 까다로운 논리를 registerWellKnownModulesIfAvailable 방법으로 여러 모듈을 등록하는. 자바 8 시간 동안 특히 : 응용 프로그램이 jackson-datatype-jsr310 모듈 봄에 의존하는 경우

// Java 8 java.time package present? 
if (ClassUtils.isPresent("java.time.LocalDate", this.moduleClassLoader)) { 
    try { 
     Class<? extends Module> javaTimeModule = (Class<? extends Module>) 
       ClassUtils.forName("com.fasterxml.jackson.datatype.jsr310.JavaTimeModule", this.moduleClassLoader); 
     objectMapper.registerModule(BeanUtils.instantiateClass(javaTimeModule)); 
    } 
    catch (ClassNotFoundException ex) { 
     // jackson-datatype-jsr310 not available 
    } 
} 

그래서 자동으로 등록합니다. 결과적으로이 모듈의 java 시간 형식에 대한 전용 serializer/deserializers가 제공됩니다. 당신은 LocalDateTimeSerializer에서 흥미 롭습니다. 당신이 볼 수 있듯이 serialization 논리는 useTimestamp에 의존하며,이 경우 false를 반환하므로 else 분기로 이동합니다. 기본적으로 _formatter은 null이고 _defaultFormatter()DateTimeFormatter.ISO_LOCAL_DATE_TIME이 사용됩니다. 날짜를 문자열로 serialize하거나 if 브랜치의 serialization 논리를 사용하려는 경우 useTimestamp 메서드에서 true을 반환하면 사용자 지정 포매터를 제공하여이 동작을 쉽게 업데이트 할 수 있습니다.

@Override 
public void serialize(LocalDateTime value, JsonGenerator g, SerializerProvider provider) 
    throws IOException 
{ 
    if (useTimestamp(provider)) { 
     g.writeStartArray(); 
     g.writeNumber(value.getYear()); 
     g.writeNumber(value.getMonthValue()); 
     g.writeNumber(value.getDayOfMonth()); 
     g.writeNumber(value.getHour()); 
     g.writeNumber(value.getMinute()); 
     if (value.getSecond() > 0 || value.getNano() > 0) { 
      g.writeNumber(value.getSecond()); 
      if(value.getNano() > 0) { 
       if (provider.isEnabled(SerializationFeature.WRITE_DATE_TIMESTAMPS_AS_NANOSECONDS)) 
        g.writeNumber(value.getNano()); 
       else 
        g.writeNumber(value.get(ChronoField.MILLI_OF_SECOND)); 
      } 
     } 
     g.writeEndArray(); 
    } else { 
     DateTimeFormatter dtf = _formatter; 
     if (dtf == null) { 
      dtf = _defaultFormatter(); 
     } 
     g.writeString(value.format(dtf)); 
    } 
} 

// since 2.7: TODO in 2.8; change to use per-type defaulting 
protected DateTimeFormatter _defaultFormatter() { 
    return DateTimeFormatter.ISO_LOCAL_DATE_TIME; 
} 

protected boolean useTimestamp(SerializerProvider provider) { 
    if (_useTimestamp != null) { 
     return _useTimestamp.booleanValue(); 
    } 
    // assume that explicit formatter definition implies use of textual format 
    if (_formatter != null) { 
     return false; 
    } 
    return provider.isEnabled(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); 
} 
관련 문제