Los solicitantes deben interpretar los metadatos. Metadatos compuestos permite formatear los valores de metadatos de forma independiente (por por ejemplo, para enrutamiento, por motivos de seguridad, rastreo), cada uno de los cuales tiene su propio tipo MIME. Las aplicaciones necesitan una forma de configurar los tipos de metadatos MIME para admitirlos, así como una forma de acceder a los valores extraídos.

MetadataExtractor es un contrato para obtener metadatos serializados y devolver pares nombre-valor decodificados, a los que luego se puede acceder como encabezados por nombre, por ejemplo a través de la anotación @Header en métodos de controlador anotados.

Se puede pasar un DefaultMetadataExtractor a instancias de Decoder para decodificar metadatos. Desde el primer momento, tiene soporte integrado para "message/x.rsocket.routing.v0", que se decodifica en un String y se almacena con la clave "route". Para cualquier otro tipo MIME, debe especificar un Decoder y registrar el tipo MIME de la siguiente manera:

Java
DefaultMetadataExtractor extractor = nuevo DefaultMetadataExtractor(metadataDecoders);
extractor.metadataToExtract(fooMimeType, Foo.class, "foo");
Kotlin
importar org.springframework.messaging.rsocket.metadataToExtract
val extractor = DefaultMetadataExtractor(metadataDecoders)
extractor.metadataToExtract<Foo>(fooMimeType, "foo")

Los metadatos compuestos son buenos para combinar valores de metadatos independientes. Sin embargo, el solicitante no podrá admitir ni utilizar metadatos compuestos. En este caso, DefaultMetadataExtractor puede requerir una lógica personalizada para mostrar el valor decodificado en el mapa de salida. A continuación se muestra un ejemplo que utiliza JSON para metadatos:

Java
DefaultMetadataExtractor extractor = nuevo DefaultMetadataExtractor(metadataDecoders);
extractor.metadataToExtract(
MimeType.valueOf("application/vnd.myapp.metadata+json"),
nuevo ParameterizedTypeReference<Map<String,String>>() {},
(jsonMap, mapa de salida) -> {
salidaMap.putAll(jsonMap);
});
Kotlin
importar org.springframework.messaging.rsocket.metadataToExtract
val extractor = DefaultMetadataExtractor(metadataDecoders)
extractor.metadataToExtract<Map<String, String>>(MimeType.valueOf("application/vnd.myapp.metadata+json")) { jsonMap, outputMap -> ;
salidaMap.putAll(jsonMap)
}

Al configurar un MetadataExtractor a través de RSocketStrategies, puede dejar que RSocketStrategies.Builder cree el extractor con los decodificadores configurados y simplemente use la devolución de llamada para configure las rutinas de registro de la siguiente manera:

Java
Estrategias RSocketStrategies = RSocketStrategies.builder()
.metadataExtractorRegistry(registro -> {
registro.metadataToExtract(fooMimeType, Foo.class, "foo");
// ...
})
.build();
Kotlin
importar org.springframework.messaging.rsocket.metadataToExtract
val estrategias = RSocketStrategies.builder()
.metadataExtractorRegistry { registro: MetadataExtractorRegistry ->
    registro.metadataToExtract<Foo>(fooMimeType, "foo")
    // ...
}
.build()