当前位置: 首页 > 知识库问答 >
问题:

Spring Boot RestTemboard ClientHttpRequest estInterceptor日志响应体在异常情况下

东郭弘
2023-03-14

我使用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");
    }

    ...

我知道这门课不可能得到回应,你能给出一个替代的解决方案吗?

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

<代码>由:com引起。fasterxml。杰克逊。数据绑定。exc.UnrecognizedPropertyException:未识别字段“items”(class com.exapmle.group.web.beans.Response),未在[源:(ByteArrayInputStream);行:1,列:11](通过com的引用链:com.exapmle.group.web.beans.Response[“items”])标记为可忽略(3个已知属性:“text”,“status”,“set cookies”])。fasterxml。杰克逊。数据绑定。exc.UnrecognedPropertyException。来自com上的(UnrecognizedPropertyException.java:61)。fasterxml。杰克逊。数据绑定。反序列化上下文。com上的handleUnknownProperty(反序列化上下文。java:823)。fasterxml。杰克逊。数据绑定。德塞。std.StdDeserializer。com上的handleUnknownProperty(StdDeserializer.java:1153)。fasterxml。杰克逊。数据绑定。德塞。BeanDeserializerBase。com上的handleUnknownProperty(beandereserializerbase.java:1589)。fasterxml。杰克逊。数据绑定。德塞。BeanDeserializerBase。handleUnknownVanilla(beandereserializerbase.java:1567)位于com。fasterxml。杰克逊。数据绑定。德塞。BeanDeserializer。vanillaDeserialize(BeanDeserializer.java:294)

共有2个答案

景仲渊
2023-03-14

这应该可以:

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

这是一个老问题,如果有人在看,我仍然会回答。如果API错误使用超文本传输协议代码(如500),我能够获得以下配置的响应。

    @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];
    }
 类似资料:
  • 1.【强制】应用中不可直接使用日志系统(Log4j、Logback)中的API,而应依赖使用日志框架SLF4J中的API,使用门面模式的日志框架,有利于维护和各个类的日志处理方式统一。 import org.slf4j.Logger; import org.slf4j.LoggerFactory; private static final Logger logger = LoggerFactory

  • 问题内容: 当我的程序运行引发异常的行时,是否可以启动IPython Shell或提示? 我对引发异常的上下文,变量,作用域(和子作用域)最感兴趣。类似于Visual Studio的调试,当引发异常但未被任何人捕获时,Visual Studio将停止并为我提供调用堆栈和每个级别存在的变量。 您是否认为有办法使用IPython获得类似的东西? 编辑:启动IPython时,该选项似乎并没有达到我想要的

  • 1.【强制】不要捕获Java类库中定义的继承自RuntimeException的运行时异常类,如:IndexOutOfBoundsException / NullPointerException,这类异常由程序员预检查来规避,保证程序健壮性。 正例:if(obj != null) {...} 反例:try { obj.method() } catch(NullPointerException e)

  • 我试图用一个网络客户端来替换现有的客户机代码。因此,大多数调用都需要阻塞,这样应用程序的主要部分就不需要更改。当谈到错误处理时,这会带来一些问题。必须涵盖以下几种情况: 在成功的情况下,响应包含A类型的JSON对象 在错误情况下(HTTP状态4xx或5xx)响应可能包含B类型的JSON对象 在某些具有响应状态404的请求上,我需要返回一个与成功响应类型匹配的空 为了产生正确的错误(

  • 你好,我正在学习OOP,通过编写一个虚拟的库管理项目在Java。 在serachBook()中,如果在ArrayList中找到book,则返回book对象,如果未找到,则抛出自定义异常BookNotFound。 问题1:它应该只返回null并在调用代码时检查返回值是否为null,还是抛出自定义异常BookNotFound。 目前我认为BookNotFinder是合适的,并且目前正在这样做。然而,我

  • 问题内容: 在Java中,我们使用try catch块处理异常。我知道我可以像下面这样编写一个try catch块来捕获方法中抛出的任何异常。 但是Java中有什么方法可以让我在发生异常时获取一种称为的特定方法,而不是像上面的方法那样编写一个包罗万象的方法? 具体来说,当抛出异常(我的应用程序逻辑未处理)时,我想在Swing应用程序中显示一条用户友好的消息。 谢谢。 问题答案: 默认情况下,JVM