代码之家  ›  专栏  ›  技术社区  ›  Antoniossss

为什么我的restemplate ClientHttpRequestInterceptor没有被调用?

  •  4
  • Antoniossss  · 技术社区  · 7 年前

    我想使用拦截器将授权头添加到通过rest模板发出的每个请求中。我是这样做的:

    public FirebaseCloudMessagingRestTemplate(@Autowired RestTemplateBuilder builder, @Value("fcm.server-key") String serverKey) {
        builder.additionalInterceptors(new ClientHttpRequestInterceptor() {
            @Override
            public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException {
                request.getHeaders().add("Authorization", "key=" + serverKey);
                System.out.println(request.getHeaders());
                return execution.execute(request, body);
            }
        });
        this.restTemplate = builder.build();
    }
    

      DownstreamHttpMessageResponse response = restTemplate.postForObject(SEND_ENDPOINT, request, DownstreamHttpMessageResponse.class);
    

    拦截器未被调用(Iv在其中放置断点,但它未触发)。发出请求并返回明显缺失的身份验证密钥响应。为什么我的拦截器没有被调用?

    1 回复  |  直到 7 年前
        1
  •  9
  •   Antoniossss    7 年前

    好的,我知道发生了什么。检查后 build() 实现我发现 RestTemplateBuilder 呼叫时不改变自身状态 additionalInterceptors 但返回一个新的生成器,其中包含给定的拦截器。链接调用解决了这个问题。

    public FirebaseCloudMessagingRestTemplate(final @Autowired RestTemplateBuilder builder, final @Value("${fcm.server-key}") String serverKey) {
        this.restTemplate = builder.additionalInterceptors((request, body, execution) -> {
            request.getHeaders().add("Authorization", "key=" + serverKey);
            log.debug("Adding authorization header");
            return execution.execute(request, body);
        }).build();
    }