跳到主要内容

自定义对象映射器

ChatGPT-4o-mini 中英对照 Custom Object Mapper

Pulsar 在序列化/反序列化 JSON 消息时使用内部的 Jackson ObjectMapper。如果您想提供自己的对象映射器实例,可以注册一个 SchemaResolverCustomizer 并按照以下方式在 DefaultSchemaResolver 上设置您的映射器:

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

这导致您的对象映射器被用于对所有经过模式解析过程的 JSON 消息进行序列化/反序列化(即在您在生产/消费消息时没有直接传递模式的情况下)。

在底层,解析器创建了一个特殊的 JSON 模式,该模式利用了自定义映射器,并作为所有解析的 JSON 消息的模式。

如果您需要直接传递模式实例,可以使用 JSONSchemaUtil 创建遵循自定义映射器的模式。以下示例展示了如何在使用带有模式参数的 PulsarTemplate 变体发送消息时做到这一点:

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

Pulsar 以特定方式配置其默认对象映射器。除非您有特定原因不这样做,否则强烈建议您按照以下方式配置您的映射器:

myObjectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
myObjectMapper.configure(DeserializationFeature.READ_UNKNOWN_ENUM_VALUES_AS_NULL, false);
myObjectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
java
备注

框架的后续版本可能会提供一个自定义工具,该工具在默认映射器上操作,而不是要求单独的实例。