@JsonFormat Annotation предотвращает использование пользовательского десериализатора в поле Instant type - PullRequest
0 голосов
/ 04 мая 2020

У меня есть приложение весенней загрузки (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?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...