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)
}

MetadataExtractorRSocketStrategiesを設定する場合、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()