自定义对象映射器

Pulsar 使用内部的 JacksonObjectMapper在解序/序列化 JSON 消息时。 如果您想提供自己的对象映射器实例,则可以注册一个SchemaResolverCustomizer并将映射器设置为DefaultSchemaResolver如下:spring-doc.cadn.net.cn

@Bean
SchemaResolverCustomizer<DefaultSchemaResolver> schemaResolverCustomizer() {
    return (DefaultSchemaResolver schemaResolver) -> {
        var myObjectMapper = obtainMyObjectMapper();
        schemaResolver.setObjectMapper(myObjectMapper);
    };
}

这会导致您的对象映射器用于解序/序列化所有经过 Schema 解析过程的 JSON 消息(即,在生成/使用消息时不直接传入 Schema)。spring-doc.cadn.net.cn

在后台,解析器会创建一个特殊的 JSON 架构,该架构利用自定义映射器,并用作所有已解析 JSON 消息的架构。spring-doc.cadn.net.cn

如果需要直接传递 schema 实例,可以使用JSONSchemaUtil创建遵循自定义映射器的架构。 以下示例显示了在发送带有PulsarTemplatevariant 的 schema 参数: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);
更高版本的框架可能会提供在默认映射器上运行的定制器,而不是需要单独的实例。