Я пытаюсь преобразовать образец вершин Quarkus в чистый Vertx 4.0 и столкнулся с проблемой.
В Quarkus можно легко настроить Jackson ObjectMapper для сериализации или десериализации HTTP-сообщений.
@ApplicationScoped
public class CustomObjectMapper implements ObjectMapperCustomizer {
@Override
public void customize(ObjectMapper objectMapper) {
objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
objectMapper.disable(SerializationFeature.WRITE_DATE_TIMESTAMPS_AS_NANOSECONDS);
objectMapper.disable(DeserializationFeature.READ_DATE_TIMESTAMPS_AS_NANOSECONDS);
JavaTimeModule module = new JavaTimeModule();
LocalDateTimeDeserializer localDateTimeDeserializer = new LocalDateTimeDeserializer(DateTimeFormatter.ISO_LOCAL_DATE_TIME);
module.addDeserializer(LocalDateTime.class, localDateTimeDeserializer);
objectMapper.registerModule(module);
}
}
А в Vertx, как изящно настроить ObjectMapper
? Я намерен зарегистрировать пользовательский ObjectMapper
вместо встроенного, поэтому при использовании Json.encode
вместо него будет использоваться мой пользовательский objectMapper
.
В моем образце VertxJson.encode
будет использовать встроенный objectMapper
для сериализации DateTime Java 8 в массив int вместо строки даты ISO.
Во-первых, вам нужно добавить jackson-databind
к вашим зависимостям, потому что Vert.x 4 не приносит транзитивно.
Затем в вашем основном методе:
io.vertx.core.json.jackson.DatabindCodec codec = (io.vertx.core.json.jackson.DatabindCodec) io.vertx.core.json.Json.CODEC;
// returns the ObjectMapper used by Vert.x
ObjectMapper mapper = codec.mapper();
// returns the ObjectMapper used by Vert.x when pretty printing JSON
ObjectMapper prettyMapper = codec.prettyMapper();
Теперь вы можете настроить оба маппера
Для меня (VertX 4.0.3) mapper()
и prettyMapper()
являются статическими методами на DatabindCodec
. Таким образом, доступ к классу Json
и приведение кодека кажется ненужным. Вы можете получить доступ к картографу напрямую, например. DatabindCodec.mapper()
.
Vertx настроил
DatabindCodec
(конечно, я включил привязку данных и модуль jsr310) с помощью JacksonFactory, которая определила тамObjectMapper
. Я не знаю, как его настроить. Для моего приложения, когда я вызываю методыJson
в обработчиках, Datetime Java 8 сериализуется не в строку, а в массив int (это общая проблема в Java, которую можно исправить, настроив параметры ObjectMapper).