自定义对象映射器

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

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

这将导致你的对象映射器在经过模式解析流程时被用来反序列化/序列化所有的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);
一个稍后的框架版本可能会提供一个针对默认映射器操作的自定义器,而不是要求使用一个单独的实例。