Как я могу перехватить WebClient
XML-ответы до того, как они будут преобразованы из байтов в DTO?
Я попытался добавить exchangeStrategy
, но как я мог преобразовать DataBuffer
в строку, а затем все еще вызывать метод super.decode()
?
ExchangeStrategies.builder().codecs((configurer) -> {
configurer.defaultCodecs().jackson2JsonDecoder(new Jaxb2XmlDecoder() {
@Override
public Flux<Object> decode(Publisher<DataBuffer> inputStream, ResolvableType elementType, MimeType mimeType, Map<String, Object> hints) {
//TODO how to log the response as string content?
return super.decode(inputStream, elementType, mimeType, hints);
}
}));
Мне удалось следующее, но я не знаю, правильное ли это решение? В частности, возврат пустой коллекции внутри flatMapInterable()
кажется неправильным, но я не нашел другого способа заставить его работать.
@Override
public Flux<Object> decode(Publisher<DataBuffer> inputStream, ResolvableType elementType, MimeType mimeType, Map<String, Object> hints) {
return DataBufferUtils.join(inputStream)
.flatMapIterable(buffer -> {
try {
LOGGER.info(StandardCharsets.UTF_8.decode(buffer.asByteBuffer()).toString());
return Collections.emptyList();
} finally {
DataBufferUtils.release(buffer);
}
})
.map(arg -> super.decode(inputStream, elementType, mimeType, hints));
}
Проблема: map()
больше не выполняется из-за того, что я уже прочитал файл DataBuffer
. Как я мог прочитать это несколько раз?