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

问题描述:

我想使用拦截器为每个通过rest模板创建的请求添加授权头。我这样做是这样的:为什么我的RestTemplate ClientHttpRequestInterceptor没有被调用?

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

拦截不叫(四把断点它,它不火)。发出请求并返回明显缺少授权密钥响应。为什么我的拦截器不被调用?

好吧,我知道最新情况。在检查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(); 
}