Реквестери повинні інтерпретувати метадані. Складені метадані дозволяють незалежно форматувати значення метаданих (наприклад, для маршрутизації, з метою безпеки, трасування), кожне з яких має власний MIME-тип. Програмам потрібен спосіб конфігурування MIME-типів метаданих для забезпечення підтримки, а також спосіб отримання доступу до вибраних значень.

MetadataExtractor — це контракт для отримання серіалізованих метаданих та повернення декодованих пар "ім'я-значення", до яких потім можна буде звертатися як до заголовків на ім'я, наприклад, через анотацію @Header в анотованих методах обробника.

DefaultMetadataExtractor може бути переданий екземплярам Decoder для декодування метаданих. "З коробки" він має вбудовану підтримку "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 може знадобитися кастомна логіка для відображення декодованого значення на Map виведення. Ось приклад, в якому для метаданих використовується 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()