自定义对象映射器

Pulsar 使用内部着色的 Jackson对象映射器在解码/序列化JSON消息时。 如果你想提供自己的 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,不是阴影org.apache.pulsar.shade.com.fasterxml.jackson.databind.ObjectMapper.

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

解析器在底层创建了一个特殊的JSON模式,利用自定义映射器,作为所有解析后的JSON消息的模式。spring-doc.cadn.net.cn

如果你需要直接传递schema实例,可以用JSONSchemaUtil创建尊重自定义映射器的模式。 以下示例展示了在发送带有脉冲星模板采用模式参数的变体: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);
框架的后续版本可能会提供一个基于默认映射器运行的定制器,而不需要单独的实例。

Jackson2 / Jackson3

在 Spring Boot 4 中,Jackson 的默认版本是 3,并通过 spring-boot-starter-json 模块自动配置。 不过,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 的自定义映射器。