Реквестери повинні інтерпретувати метадані. Складені метадані дозволяють незалежно форматувати значення метаданих (наприклад, для маршрутизації, з метою безпеки, трасування), кожне з яких має власний MIME-тип. Програмам потрібен спосіб конфігурування MIME-типів метаданих для забезпечення підтримки, а також спосіб отримання доступу до вибраних значень.
MetadataExtractor
— це контракт для отримання серіалізованих метаданих та повернення декодованих пар
"ім'я-значення", до яких потім можна буде звертатися як до заголовків на ім'я, наприклад, через анотацію @Header
в анотованих методах обробника.
DefaultMetadataExtractor
може бути переданий екземплярам Decoder
для декодування метаданих.
"З коробки" він має вбудовану підтримку "message/x.rsocket.routing. v0", який декодується в String
та зберігається з ключем "route". Для будь-якого іншого MIME-типу необхідно вказати Decoder
та
зареєструвати MIME-тип таким чином:
DefaultMetadataExtractor extractor = new DefaultMetadataExtractor(metadataDecoders);
extractor.metadataToExtract(fooMimeType, Foo.class, "foo");
import org.springframework.messaging.rsocket.metadataToExtract
val extractor = DefaultMetadataExtractor(metadataDecoders)
extractor.metadataToExtract<Foo>(fooMimeType, "foo")
Складені метадані добре підходять для об'єднання незалежних значень метаданих. Проте реквестер може підтримувати
складені метадані чи використовувати їх. У цьому випадку DefaultMetadataExtractor
може знадобитися
кастомна логіка для відображення декодованого значення на Map виведення. Ось приклад, в якому для метаданих
використовується JSON:
DefaultMetadataExtractor extractor = new DefaultMetadataExtractor(metadataDecoders);
extractor.metadataToExtract(
MimeType.valueOf("application/vnd.myapp.metadata+json"),
new ParameterizedTypeReference<Map<String,String>>() {},
(jsonMap, outputMap) -> {
outputMap.putAll(jsonMap);
});
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
створити екстрактор із налаштованими декодерами і просто використовувати зворотний виклик для налаштування процедур
реєстрації таким чином:
RSocketStrategies strategies = RSocketStrategies.builder()
.metadataExtractorRegistry(registry -> {
registry.metadataToExtract(fooMimeType, Foo.class, "foo");
// ...
})
.build();
import org.springframework.messaging.rsocket.metadataToExtract
val strategies = RSocketStrategies.builder()
.metadataExtractorRegistry { registry: MetadataExtractorRegistry ->
registry.metadataToExtract<Foo>(fooMimeType, "foo")
// ...
}
.build()
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ