TestRestTemplate - регистрация ответа без разрушения тела - PullRequest
0 голосов
/ 07 апреля 2019

Для регистрации запроса и ответа я добавил LoggingRequestInterceptor , который реализует ClientHttpRequestInterceptor ...

Тело ответа - это поток, и если я прочитаю его на моем перехватчике, TestRestTemplate не сможет десериализовать его в мою объектную модель. Другими словами, когда я вызываю testRestTemplate.get ... я всегда получаю пустые объекты (даже когда я вижу объект, мой ответ).

Чтобы решить эту проблему для RestTemplate, это можно исправить с помощью BufferingClientHttpRequestFactory . Я не знаю, как это исправить для TestRestTemplate хотя ...

Я попытался добавить BufferingClientHttpRequestFactory к экземпляру RestTemplate, а затем обернуть TestRestTemplate этим экземпляром:

restTemplateBuilder.configure(restTemplate);

... но тогда вообще нет регистрации.

Так я добавляю перехватчик логирования.

public static RestTemplateBuilder withInterceptors() {
        List<ClientHttpRequestInterceptor> interceptors = new ArrayList<>();
        interceptors.add(new LoggingRequestInterceptor());

        return new RestTemplateBuilder()
                .interceptors(interceptors);
    }

В конце я бы хотел: 1. Зарегистрируйте тело ответа 2. Десериализовать его в объектную модель (теперь, если я включаю ведение журнала, будет ноль)

Ответы [ 2 ]

0 голосов
/ 09 апреля 2019
TestRestTemplate testRestTemplate = new TestRestTemplate();

testRestTemplate.getRestTemplate()
                .setRequestFactory(new BufferingClientHttpRequestFactory(new SimpleClientHttpRequestFactory()));
0 голосов
/ 08 апреля 2019

Самый простой способ отладки запроса / ответа - установить его в свойствах:

logging.level.org.apache.http=DEBUG

И с BufferingClientHttpResponseWrapper:

public class LoggingRequestInterceptor implements ClientHttpRequestInterceptor {

    private static final Logger logger = LoggerFactory.getLogger(LoggingRequestInterceptor.class);

    @Override
    public ClientHttpResponse intercept(final HttpRequest request, final byte[] body,
            final ClientHttpRequestExecution execution) throws IOException {
        ClientHttpResponse response = execution.execute(request, body);

        response = log(request, body, response);

        return response;
    }

    private ClientHttpResponse log(final HttpRequest request, final byte[] body, final ClientHttpResponse response) {
        final ClientHttpResponse responseCopy = new BufferingClientHttpResponseWrapper(response);
        logger.debug("Method: ", request.getMethod().toString());
        logger.debug("URI: ", , request.getURI().toString());
        logger.debug("Request Body: " + new String(body));
        logger.debug("Response body: " + IOUtils.toString(responseCopy.getBody()));
        return responseCopy;
    }

}

и настройка:

LoggingRequestInterceptor loggingInterceptor = new LoggingRequestInterceptor();
restTemplate.getInterceptors().add(loggingInterceptor);
...