自定义对象映射器

Pulsar 在反序列化和序列化 JSON 消息时使用内部 shade 的 Jackson ObjectMapper。如果你希望提供你自己的 Jackson 2 对象映射器实例,可以注册一个 SchemaResolverCustomizer 并在 DefaultSchemaResolver 上设置你的映射器,如下所示:spring-doc.cadn.net.cn

@Bean
SchemaResolverCustomizer<DefaultSchemaResolver> schemaResolverCustomizer() {
    return (DefaultSchemaResolver schemaResolver) -> {
        var myObjectMapper = obtainMyObjectMapper();
        schemaResolver.setObjectMapper(myObjectMapper);
    };
}
示例中的对象映射器应该是一个 com.fasterxml.jackson.databind.ObjectMapper 的实例,而不是 被 shade 的 org.apache.pulsar.shade.com.fasterxml.jackson.databind.ObjectMapper

这将导致你的对象映射器在经过模式解析流程时被用来反序列化/序列化所有的JSON消息(即在你未直接传递模式的情况下生产或消费消息时)。spring-doc.cadn.net.cn

解析器会在底层创建一个特殊的JSON schema,该schema利用自定义的mapper,并作为所有解析后JSON消息的schema。spring-doc.cadn.net.cn

如果需要直接传递模式实例,可以使用JSONSchemaUtil来创建尊重自定义映射器的模式。 以下示例展示了在发送使用带有模式参数的PulsarTemplate变体消息时如何操作:spring-doc.cadn.net.cn

void sendMessage(PulsarTemplate<MyPojo> template, MyPojo toSend) {
    var myObjectMapper = obtainMyObjectMapper();
    var schema = JSONSchemaUtil.schemaForTypeWithObjectMapper(MyPojo.class, myObjectMapper);
    template.send(toSend, schema);
}

Pulsar 以特定方式配置其默认对象映射器。 除非有特定原因不这样做,否则强烈推荐您以相同选项配置您的映射器,如下所示:spring-doc.cadn.net.cn

myObjectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
myObjectMapper.configure(DeserializationFeature.READ_UNKNOWN_ENUM_VALUES_AS_NULL, false);
myObjectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
一个稍后的框架版本可能会提供一个针对默认映射器操作的自定义器,而不是要求使用一个单独的实例。

Jackson 2 / Jackson 3

在 Spring Boot 4 中,默认的 Jackson 版本为 3,并通过 spring-boot-starter-json 模块自动配置。 然而,Spring for Apache Pulsar 期望一个 Jackson 2 自定义映射器。spring-doc.cadn.net.cn

如果在您的 Spring Boot 4 应用程序中使用 Jackson 3 并且想要使用自定义的映射器,您需要将 Jackson 2 添加到类路径中。 不用担心,Spring Boot 4 允许在应用程序中同时使用 Jackson 2 和 3。spring-doc.cadn.net.cn

一个稍后版本的框架可能会支持使用 Jackson 2 或 Jackson 3 的自定义映射器。