У меня есть приложение весенней загрузки (2.2.6.RELEASE) с клиентом, который извлекает некоторые данные из внешнего сервиса. Мне нужен собственный десериализатор для обработки временных строк, таких как «0000-00-00 00:00:00». Для этого я создаю ObjectMapper с помощью Jackson2ObjectMapperBuilder, например, так:
JavaTimeModule instantModule = new JavaTimeModule();
instantModule.addDeserializer(Instant.class, NullAwareInstantDeserializer.INSTANT);
ObjectMapper mapper = jackson2ObjectMapperBuilder.modulesToInstall(instantModule).build();
public class NullAwareInstantDeserializer<T extends Temporal> extends InstantDeserializer<T> {
public static final NullAwareInstantDeserializer<Instant> INSTANT = new NullAwareInstantDeserializer<>(
Instant.class, DateTimeFormatter.ISO_INSTANT,
Instant::from,
a -> Instant.ofEpochMilli(a.value),
a -> Instant.ofEpochSecond(a.integer, a.fraction),
null,
true // yes, replace zero offset with Z
);
protected NullAwareInstantDeserializer(Class<T> supportedType, DateTimeFormatter formatter, Function<TemporalAccessor, T> parsedToValue, Function<FromIntegerArguments, T> fromMilliseconds, Function<FromDecimalArguments, T> fromNanoseconds, BiFunction<T, ZoneId, T> adjust, boolean replaceZeroOffsetAsZ) {
super(supportedType, formatter, parsedToValue, fromMilliseconds, fromNanoseconds, adjust, replaceZeroOffsetAsZ);
}
protected NullAwareInstantDeserializer(InstantDeserializer<T> base, DateTimeFormatter f) {
super(base, f);
}
protected NullAwareInstantDeserializer(InstantDeserializer<T> base, Boolean adjustToContextTimezoneOverride) {
super(base, adjustToContextTimezoneOverride);
}
@SuppressWarnings("unchecked")
@Override
public T deserialize(JsonParser parser, DeserializationContext context) throws IOException {
if (parser.getCurrentTokenId() == JsonTokenId.ID_STRING) {
if(parser.getText().trim().equals("0000-00-00 00:00:00")) {
return null;
}
}
return super.deserialize(parser, context);
}
}
data class TestlinkTestCase(val id: Int, val external_id: String, val name: String, val summary: String?, val preconditions: String?, val version: Int?, val parent_id: Int,
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "UTC") val modification_ts: Instant?)
Проблема заключается в том, как только я аннотирую поле, которое должно быть сериализовано с @JsonFormat обычного InstantDeserializer пакета Джексона JSR301 используется вместо моего пользовательского десериализатора. Если я удаляю эту аннотацию, мой пользовательский десериализатор используется, но десериализация завершается неудачно, как только он делегируется обычному InstantDeserializer для очевидных результатов (формат даты неизвестен). Любая идея, почему это так и как использовать мой собственный десериализатор и аннотировать поле с @JsonFormat?