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