【问题标题】:Spring Boot RestTemplate ClientHttpRequestInterceptor log response body in case of exceptionSpring Boot RestTemplate ClientHttpRequestInterceptor 日志响应正文以防出现异常
【发布时间】:2020-02-11 15:33:54
【问题描述】:

我正在使用 ClientHttpRequestInterceptor 报告 RestTemplate 的请求输出和响应输入。如果出现异常,我需要记录响应,假设模板是否试图用错误的类解组响应。

拦截器是这样启用的:

@Bean
public RestTemplate restTemplate(ReportingConfiguration reportingConfiguration) {
    return new RestTemplateBuilder()
            .interceptors(new RestTemplateInterceptor())
            .build();
}

这里接受的唯一接口是 ClientHttpRequestInterceptor。 拦截器看起来像:

@Override
public ClientHttpResponse intercept(HttpRequest req, byte[] body, ClientHttpRequestExecution execution) throws IOException {

    ...

    ClientHttpResponse response = null;
    try {
        response = execution.execute(request, body);
    } catch (Exception e) {
        System.out.println("I need to get the response here");
    }

    ...

我知道这门课不可能得到响应,您能否提供一个替代解决方案?

这是一个异常示例:(请不要解释如何摆脱这个异常,我知道我为什么会得到这个,我只是想记录有效负载以防发生这种情况)

Caused by: com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "items" (class com.exapmle.group.web.beans.Response), not marked as ignorable (3 known properties: "text", "status", "set-cookies"]) at [Source: (ByteArrayInputStream); line: 1, column: 11] (through reference chain: com.exapmle.group.web.beans.Response["items"]) at com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException.from(UnrecognizedPropertyException.java:61) at com.fasterxml.jackson.databind.DeserializationContext.handleUnknownProperty(DeserializationContext.java:823) at com.fasterxml.jackson.databind.deser.std.StdDeserializer.handleUnknownProperty(StdDeserializer.java:1153) at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.handleUnknownProperty(BeanDeserializerBase.java:1589) at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.handleUnknownVanilla(BeanDeserializerBase.java:1567) at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:294)

【问题讨论】:

  • 你能提供更多代码和堆栈跟踪吗?
  • this

标签: java spring spring-boot resttemplate interceptor


【解决方案1】:

这是个老问题,如果有人在看,我仍然会回答。如果出现 API 错误,例如 500 的 http 代码,我可以通过以下配置获得响应。

    @Bean
    public RestTemplate restTemplate(RestTemplateBuilder builder) {

        SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
        factory.setConnectTimeout(5000);
        factory.setReadTimeout(5000); 

        RestTemplate restTemplate = new RestTemplate(new BufferingClientHttpRequestFactory(factory));
        restTemplate.setInterceptors(Collections.singletonList(new CustomLoggingRequestInterceptor()));

        return restTemplate;
    }

现在是日志拦截器。

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

    private void traceResponse(ClientHttpResponse response) throws IOException {
        StringBuilder inputStringBuilder = new StringBuilder();

        inputStringBuilder.append(new String(getResponseBody(response), StandardCharsets.UTF_8));
         log.error(inputStringBuilder.toString()); 
      }
   
    protected byte[] getResponseBody(ClientHttpResponse response) {
        try {
            return FileCopyUtils.copyToByteArray(response.getBody());
        } catch (IOException ex) {
            // ignore
        }
        return new byte[0];
    }

【讨论】:

    【解决方案2】:

    这应该有效:

    ClientHttpResponse response = null;
    try {
        response = execution.execute(request, body);
    } catch (Exception e) {
        System.out.println("I need to get the response here", e.getMessage());
    }
    

    【讨论】:

    • 这样我只看到异常而不是payload
    • 你得到的异常到底是什么。 ?可以发一下吗?
    • 什么意思?
    猜你喜欢
    • 2020-08-26
    • 1970-01-01
    • 2017-03-15
    • 2023-02-24
    • 2019-04-09
    • 1970-01-01
    • 2016-06-26
    • 1970-01-01
    • 2011-12-14
    相关资源
    最近更新 更多