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

如何使ClientHttpRequestInterceptor工作?

钱安和
2023-03-14

我正在尝试让ClientHttpRequestInterceptor遵循BaelDung的Spring RestTemplate请求/响应日志记录工作。问题是ClientHttpRequestInterceptor从未被调用

我在HandlerInterceptor和HandlerInterceptorAdapter拦截器中遇到了类似的问题。问题是我需要一个add a listener,这是我发现的99%的文章都没有提到的。

@Configuration
public class ListenerConfig implements WebApplicationInitializer {
    @Override
    public void onStartup(ServletContext sc) throws ServletException {
        sc.addListener(new RequestContextListener());
    }
}

我猜Spring的一些东西已经改变了,默认情况下监听器不在那里。

有人知道ClientHttpRequestInterceptor的侦听器吗?

public class LoggingInterceptor implements ClientHttpRequestInterceptor {

    static Logger LOGGER = LoggerFactory.getLogger(LoggingInterceptor.class);

    @Override
    public ClientHttpResponse intercept(
            HttpRequest req, byte[] reqBody, ClientHttpRequestExecution ex) throws IOException {
        LOGGER.debug("Request body: {}", new String(reqBody, StandardCharsets.UTF_8));
        ClientHttpResponse response = ex.execute(req, reqBody);
        InputStreamReader isr = new InputStreamReader(
          response.getBody(), StandardCharsets.UTF_8);
        String body = new BufferedReader(isr).lines()
            .collect(Collectors.joining("\n"));
        LOGGER.debug("Response body: {}", body);
        return response;
    }
}
@Configuration
public class RestClientConfig {

    @Bean
    public RestTemplate restTemplate() {
        RestTemplate restTemplate = new RestTemplate();

        List<ClientHttpRequestInterceptor> interceptors
          = restTemplate.getInterceptors();
        if (CollectionUtils.isEmpty(interceptors)) {
            interceptors = new ArrayList<>();
        }
        interceptors.add(new LoggingInterceptor());
        restTemplate.setInterceptors(interceptors);
        return restTemplate;
    }
}

共有1个答案

鄢子平
2023-03-14

Spring RestTemplate拦截器仅在客户机(使用者)端或测试中工作,其中测试充当客户机,您有RestTemplate。我正在尝试登录服务器(生产者)端。因此,不需要RestTemplate

bealdung.com的一位Loredana很好地给我发了电子邮件,指出我有一个误解。

在我捡到的地方 <罢工> Spring使用了 resttemplate用于Rest控制器中POJO的自动解码和编码。 不正确。

@Tashkhisi还指出了Commets中缺少resttempale

 类似资料:
  • 我有多个ClientHttpRequestInterceptor设置为我的RestTemplate(CommonRestTemplateBuilder)的公共配置,其中一个是LogRequestInterceptor。 问题是,当我在一个新的@配置中添加一个新的ClientHttpRequestInterceptor时,我使用commonRestTemplateBuilder作为基础创建了另一个R

  • 我的项目是在Go中使用OpenTelemata进行跟踪,我使用的库之一仅支持OpentRacing中的跟踪。我直接在库中启用了跟踪,看起来它不起作用。对于这种情况,我如何让它们一起工作?

  • PPMessage客服平台包括PPConsole,PPKefu,PPCom,PPMessage服务器四部分。前三者属于客户端范畴,都连接着PPMessage服务器。 PPKefu, PPConsole, PPCom 与 PPMessage服务器 +--------------------+ 1 +-----------------------+ 2 +----

  • 前面小节介绍了如何通过Go搭建一个Web服务,我们可以看到简单应用一个net/http包就方便的搭建起来了。那么Go在底层到底是怎么做的呢?万变不离其宗,Go的Web服务工作也离不开我们第一小节介绍的Web工作方式。 web工作方式的几个概念 以下均是服务器端的几个概念 Request:用户请求的信息,用来解析用户的请求信息,包括post、get、cookie、url等信息 Response:服务

  • 我希望能够在我的应用程序中使用此颜色选择器: http://wpftoolkit.codeplex.com/wikipage?title=ColorPicker 我正在使用安装了. NET 4的Visual Studio 2010 Ultimate。我正在用C#和WPF(XAML)编码。 到目前为止我所做的: > 试图使用 谷歌搜索解决方案、教程或示例,但没有取得太大成功。 请解释扩展WPF工具包

  • 问题内容: 会话文件通常存储在(例如)服务器上,并命名为。我一直在查看内容,但无法弄清楚它们是如何工作的。 从文件中获取变量名称和内容很容易。但是PHP如何知道哪个会话属于谁? session_id似乎是完全随机的,一个IP地址可以有多个用户,并且每个用户打开多个浏览器窗口时可以有多个会话。 那么它是怎样工作的? 问题答案: 在一般情况下: 会话ID在用户创建会话后发送给用户。 它存储在cooki