カスタムオブジェクトマッパー
Pulsar は、JSON メッセージのデシリアライズ / デシリアライズ時に、内部的にシェーディングされた Jackson ObjectMapper を使用します。代わりに独自の Jackson 2 オブジェクトマッパーインスタンスを用意したい場合は、以下のように SchemaResolverCustomizer を登録し、DefaultSchemaResolver にマッパーを設定することができます。
@Bean
SchemaResolverCustomizer<DefaultSchemaResolver> schemaResolverCustomizer() {
return (DefaultSchemaResolver schemaResolver) -> {
var myObjectMapper = obtainMyObjectMapper();
schemaResolver.setObjectMapper(myObjectMapper);
};
} 上記の例のオブジェクトマッパーは、影付きの org.apache.pulsar.shade.com.fasterxml.jackson.databind.ObjectMapper ではなく、com.fasterxml.jackson.databind.ObjectMapper のインスタンスである必要があります。 |
これにより、オブジェクトマッパーは、スキーマ解決プロセスを経るすべての 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);
}Pulsar は、デフォルトのオブジェクトマッパーを特定の方法で構成します。特別な理由がない限り、次のように同じオプションを使用してマッパーを構成することを強くお勧めします。 |
| フレームワークの以降のバージョンでは、別のインスタンスを必要とせず、デフォルトのマッパーで動作するカスタマイザーが提供される場合があります。 |
Jackson 2/Jackson 3
Spring Boot 4 では Jackson は 3 のデフォルトバージョンであり、spring-boot-starter-json モジュールによって自動構成されます。ただし、Spring for Apache Pulsar では Jackson 2 カスタムマッパーが必要です。
Spring Boot 4 アプリケーションで Jackson 3 を使用しており、カスタムマッパーを使用する場合は、Jackson 2 をクラスパスに追加する必要があります。ご安心ください。Spring Boot 4 では、Jackson 2 と 3 をアプリケーション内で共存させることができます。
| フレームワークの新しいバージョンでは、Jackson 2 または Jackson 3 カスタムマッパーの使用がサポートされる可能性があります。 |