结论:jackson LocalDateTime 时间格式序列化、反序列化都用@JsonFormat,坚决不用@DateTimeFormat
用法如下所示
@JsonFormat(pattern = "yyyy-MM-dd HH")
@JsonDeserialize(using = LocalDateTimeDeserializer.class)
@JsonSerialize(using = LocalDateTimeSerializer.class)
private LocalDateTime dateTime;
源码探究
com.fasterxml.jackson.datatype.jsr310.deser.JSR310DateTimeDeserializerBase的下面的方法,
该方法取得是@JsonFormat注解定义的值,跟@DateTimeFormat注解没有关系,
@Override
public JsonDeserializer<?> createContextual(DeserializationContext ctxt,
BeanProperty property) throws JsonMappingException
{
JsonFormat.Value format = findFormatOverrides(ctxt, property, handledType());
JSR310DateTimeDeserializerBase<?> deser = this;
if (format != null) {
if (format.hasPattern()) {
final String pattern = format.getPattern();
final Locale locale = format.hasLocale() ? format.getLocale() : ctxt.getLocale();
DateTimeFormatterBuilder builder = new DateTimeFormatterBuilder();
if (acceptCaseInsensitiveValues(ctxt, format)) {
builder.parseCaseInsensitive();
}
builder.appendPattern(pattern);
DateTimeFormatter df;
if (locale == null) {
df = builder.toFormatter();
} else {
df = builder.toFormatter(locale);
}
//Issue #69: For instant serializers/deserializers we need to configure the formatter with
//a time zone picked up from JsonFormat annotation, otherwise serialization might not work
if (format.hasTimeZone()) {
df = df.withZone(format.getTimeZone().toZoneId());
}
deser = deser.withDateFormat(df);
}
// 17-Aug-2019, tatu: For 2.10 let's start considering leniency/strictness too
if (format.hasLenient()) {
Boolean leniency = format.getLenient();
if (leniency != null) {
deser = deser.withLeniency(leniency);
}
}
// any use for TimeZone?
}
return deser;
}
jackson反序列化器源码
LocalDateTimeDeserializer初始化格式源码
实现的是抽象类JSR310DateTimeDeserializerBase 的方法
该抽象方法被createContextual方法使用