Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java TestRestTemplate-在不破坏主体的情况下记录响应_Java_Spring Boot_Resttemplate - Fatal编程技术网

Java TestRestTemplate-在不破坏主体的情况下记录响应

Java TestRestTemplate-在不破坏主体的情况下记录响应,java,spring-boot,resttemplate,Java,Spring Boot,Resttemplate,为了记录请求和响应,我添加了一个LoggingRequestInterceptor,它实现了clienthttpprequestinterceptor 响应主体是一个流,如果我将其读取到我的拦截器中,TestRestTemplate将无法将其反序列化到我的对象模型中。换句话说,当我调用testRestTemplate.get…时,我总是会返回空对象(即使我看到对象是我的响应) 要解决RestTemplate的此问题,可以使用BufferingClientHttpRequestFactory来修复

为了记录请求和响应,我添加了一个LoggingRequestInterceptor,它实现了clienthttpprequestinterceptor

响应主体是一个流,如果我将其读取到我的拦截器中,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);
    }
publicstaticrestemplatebuilderwithinterceptors(){
列表拦截器=新的ArrayList();
add(新的LoggingRequestInterceptor());
返回新的RestTemplateBuilder()
.拦截器(拦截器);
}
最后,我想: 1.记录响应主体
2.将其反序列化为对象模型(如果启用日志记录,现在为空)

调试请求/响应的最简单方法是在属性中设置:

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);

调试请求/响应的最简单方法是在属性中设置:

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);

非常感谢你!我也找到了另一种方法。见下:非常感谢!我也找到了另一种方法。见下文: