使用自定义对象映射器在 Vertx 4.0 中注册 Jackson Codec 的位置在哪里

Han*_*tsy 7 java vert.x vertx-verticle

我正在尝试将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);
    }
}
Run Code Online (Sandbox Code Playgroud)

而在Vertx中,如何ObjectMapper优雅地定制呢?我的目的是注册一个自定义ObjectMapper而不是内置自定义,因此在使用 时Json.encode,它将使用我的自定义objectMapper

我的 Vertx 示例中,Json.encode将使用内置函数objectMapper将 Java 8 DateTime 序列化为 int 数组而不是 ISO 日期字符串。

tse*_*ont 7

首先,您需要添加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();
Run Code Online (Sandbox Code Playgroud)

现在您可以配置两个映射器

  • 对我来说(VertX 4.0.3)“mapper()”和“prettyMapper()”是“DatabindCodec”上的静态方法。因此,访问“Json”类并转换编解码器似乎没有必要。您可以直接访问映射器,例如“DatabindCodec.mapper()”。 (3认同)