5.4. MetadataExtractor

편집일시: 2021-04-10 07:51 조회수: 209 댓글수: 0
응답자는 메타 데이터를 해석해야 한다. [복합 메타 데이터](https://github.com/rsocket/rsocket/blob/master/Extensions/CompositeMetadata.md)는 고유의 MIME 타입을 사용하여 개별적으로 포맷 된 메타 데이터 값(라우팅, 보안, 추적 등)을 사용할 수 있다. 응용 프로그램은 지원하는 메타 데이터 MIME 유형을 구성하는 방법과 추출 된 값에 액세스하는 방법이 필요한다. `MetadataExtractor`는 직렬화 된 메타 데이터를 검색하고, 디코딩된 이름 및 값 쌍으로 반환하도록 되어 있다. 명명된 헤더처럼, 예를 들어 어노테이션이 선언된 핸들러 메소드의 `@Header`를 통해 액세스 할 수 있다. `DefaultMetadataExtractor`에 Decoder 인스턴스를 제공하여, 메타 데이터를 디코딩 할 수 있다. 즉시 사용 가능한 [`"message/x.rsocket.routing.v0"`](https://github.com/rsocket/rsocket/blob/master/Extensions/Routing.md) 내장 지원이 있고, `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() ```