Spring Web Reactive | 5. RSocket | 5.4. MetadataExtractor

응답자는 메타 데이터를 해석해야 한다. 복합 메타 데이터는 고유의 MIME 타입을 사용하여 개별적으로 포맷 된 메타 데이터 값(라우팅, 보안, 추적 등)을 사용할 수 있다. 응용 프로그램은 지원하는 메타 데이터 MIME 유형을 구성하는 방법과 추출 된 값에 액세스하는 방법이 필요한다.

MetadataExtractor는 직렬화 된 메타 데이터를 검색하고, 디코딩된 이름 및 값 쌍으로 반환하도록 되어 있다. 명명된 헤더처럼, 예를 들어 어노테이션이 선언된 핸들러 메소드의 @Header를 통해 액세스 할 수 있다.

DefaultMetadataExtractor에 Decoder 인스턴스를 제공하여, 메타 데이터를 디코딩 할 수 있다. 즉시 사용 가능한 "message/x.rsocket.routing.v0" 내장 지원이 있고, String 디코딩하여 “라우트” 키에 저장한다. 그외에 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()



최종 수정 : 2021-04-12