我編寫了一個ClientHttpRequestInterceptor實現,以便將一些HttpHeader自動插入到我的Spring Boot服務的任何傳出請求中。在ClientHttpRequestInterceptor中未注入到私有變量的應用程序屬性
我要支持的標題之一是指示發送此請求的源應用程序。爲此,我將「spring.application.name」應用程序屬性注入到一個私有變量中,並使用該私有變量來設置HttpHeader。
public class ClientHeaderPropagationInterceptor implements ClientHttpRequestInterceptor {
@Value("${spring.application.name}")
private String appName;
@Override
public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException {
log.debug("ClientHeaderPropagationInterceptor in action");
// Set source header for traceability between microservices
log.debug("Setting request source to {}", appName);
requestHeaders.set("source", appName);
return execution.execute(request, body);
}
}
但是我在上面的appName變量中得到了一個「null」值。這是因爲攔截器在可以注入任何屬性之前被初始化?任何意見將不勝感激。
攔截器類插入從@Bean的RestTemplate生命週期,其中RestTemplate注入:
@Configuration
public class ApplicationConfig {
...
@LoadBalanced
@Bean(name = "loadBalancedRestTemplate")
public RestTemplate getLoadBalancedRestTemplate(){
RestTemplate restTemplate = new RestTemplate(customHttpRequestFactory());
restTemplate.setErrorHandler(new CustomResponseHandler());
restTemplate.getMessageConverters().add(0, new StringHttpMessageConverter(StandardCharsets.UTF_8));
restTemplate.setInterceptors(Collections.singletonList(new ClientHeaderPropagationInterceptor()));
return restTemplate;
}
...
}
我可以證實,攔截並得到運行,我可以看到log.debug消息,但appName變量仍然爲空。
你是如何創建ClientHeaderPropagationInterceptor對象的? – mhshimul
hi @shi通過編輯原文發表回覆,謝謝。 – feicipet