Spring Web Reactive | 5. RSocket | 5.4. MetadataExtractor
レスポンダーはメタデータを解釈する必要があります。複合メタデータは独自のMIMEタイプを使用し、ルーティング、セキュリティ、トレーシングなど、個別にフォーマットされたメタデータ値を含めることができます。アプリケーションには、サポートするメタデータMIMEタイプを設定し、抽出された値へアクセスする方法が必要です。
MetadataExtractorはシリアライズされたメタデータを抽出し、デコードした名前と値のペアを返します。アノテーション付きハンドラーメソッドの@Headerなどを通じて、名前付きヘッダーのようにアクセスできます。
DefaultMetadataExtractorへデコーダーインスタンスを指定すると、メタデータをデコードできます。"message/x.rsocket.routing.v0"は組み込みでサポートされ、Stringとしてデコードされて"route"キーへ保存されます。その他のMIMEタイプでは、Decoderを指定し、次のようにMIMEタイプを登録します。
Java
DefaultMetadataExtractor extractor = new DefaultMetadataExtractor(metadataDecoders);
extractor.metadataToExtract(fooMimeType, Foo.class, "foo");
Kotlin
import org.springframework.messaging.rsocket.metadataToExtract
val extractor = DefaultMetadataExtractor(metadataDecoders)
extractor.metadataToExtract<Foo>(fooMimeType, "foo")
複合メタデータは、個別のメタデータ値を組み合わせる用途に適しています。ただし、リクエスターが複合メタデータをサポートしていない場合や、使用しない場合があります。そのため、DefaultMetadataExtractorには、デコードした値を出力マップへ対応付けるカスタムロジックが必要になることがあります。次の例ではJSONメタデータを使用します。
Java
DefaultMetadataExtractor extractor = new DefaultMetadataExtractor(metadataDecoders);
extractor.metadataToExtract(
MimeType.valueOf("application/vnd.myapp.metadata+json"),
new ParameterizedTypeReference<Map<String,String>>() {},
(jsonMap, outputMap) -> {
outputMap.putAll(jsonMap);
});
Kotlin
import org.springframework.messaging.rsocket.metadataToExtract
val extractor = DefaultMetadataExtractor(metadataDecoders)
extractor.metadataToExtract<Map<String, String>>(MimeType.valueOf("application/vnd.myapp.metadata+json")) { jsonMap, outputMap ->
outputMap.putAll(jsonMap)
}
MetadataExtractorでRSocketStrategiesを設定する場合、RSocketStrategies.Builderに設定されたデコーダーを使用して抽出処理を作成し、コールバックで登録内容を定義できます。
Java
RSocketStrategies strategies = RSocketStrategies.builder()
.metadataExtractorRegistry(registry -> {
registry.metadataToExtract(fooMimeType, Foo.class, "foo");
// ...
})
.build();
Kotlin
import org.springframework.messaging.rsocket.metadataToExtract
val strategies = RSocketStrategies.builder()
.metadataExtractorRegistry { registry: MetadataExtractorRegistry ->
registry.metadataToExtract<Foo>(fooMimeType, "foo")
// ...
}
.build()