Как перехватить HTTP-трафик ответа в Spring WebClient/DataBuffer?

Как я могу перехватить 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. Как я мог прочитать это несколько раз?


person membersound    schedule 15.07.2019    source источник


Ответы (1)


Пока я придумал следующее решение. Это работает, но я все еще открыт для улучшений, так как я даже не знаю, правильно ли я это делаю.

@Override
public Flux<Object> decode(Publisher<DataBuffer> inputStream, ResolvableType elementType, MimeType mimeType, Map<String, Object> hints) {
    return DataBufferUtils.join(inputStream)
            .doOnNext(buf -> LOGGER.info(StandardCharsets.UTF_8.decode(buf.asByteBuffer()).toString()))
            .flatMapMany(buf -> super.decode(Mono.fromSupplier(() -> buf), elementType, mimeType, hints));
}
person membersound    schedule 16.07.2019