Как запретить Джексону десериализовать Мгновенно из эпохи Миллиса? - PullRequest
3 голосов
/ 16 мая 2019

Я занимаюсь разработкой API с использованием Spring Boot и использую Джексона для сериализации полезной нагрузки.Я хочу десериализовать дату и время в формате ISO-8601 в java.time.Instant, но не хочу поддерживать десериализацию со времени эпохи в миллисекундах или наносекундах.Я хочу поддерживать только данные, предоставляемые моему API в одном формате, чтобы уменьшить вероятность ошибки клиента.

В настоящее время Джексон десериализуется до мгновенного состояния как из строки в формате ISO-8601, так и из строки, содержащей толькочисла, например "20190520".

Существуют ли аннотации Джексона, которые я могу использовать в своем поле Instant, или свойства, которые можно установить для применения такого поведения?Или пользовательский десериализатор мой единственный вариант?

1 Ответ

2 голосов
/ 16 мая 2019

Существуют ли аннотации Джексона, которые я могу использовать в своем поле «Мгновенно», или свойства, которые можно установить для применения такого поведения? Или пользовательский десериализатор мой единственный вариант?

Мне лично не известны аннотации, которые сделают это из коробки; но вот простой десериализатор, который делает эту работу:

import java.io.IOException;
import java.time.Instant;

import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.deser.std.StdDeserializer;

public class JacksonInstantDeserializer extends StdDeserializer<Instant> {
    public JacksonInstantDeserializer() { this(null); }
    public JacksonInstantDeserializer(Class<?> clazz) { super(clazz); }

    @Override
    public Instant deserialize(JsonParser parser, DeserializationContext ctx) throws IOException {
        return Instant.parse(parser.getText());
    }
}

В основном используется Instant.parse; который принимает ТОЛЬКО форматированную строку ISO-8601 (он выдаст DateTimeParseException, если строка не отформатирована соответствующим образом) и создает на основе Instant на его представлении. Затем вы можете использовать команду Tell Jackson, чтобы использовать этот конвертер для десериализации свойств Instant ваших DTO следующим образом:

    public class MyDTO {
        @JsonDeserialize(using = JacksonInstantDeserializer.class)
        public Instant instant;
    }

Надеюсь, это поможет.

...