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