2017-05-28 112 views
0

我編寫了一個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變量仍然爲空。

+0

你是如何創建ClientHeaderPropagationInterceptor對象的? – mhshimul

+0

hi @shi通過編輯原文發表回覆,謝謝。 – feicipet

回答

1

@Value不適用於非託管彈簧豆。首先你需要讓它成爲彈簧管理。請嘗試以下操作:

@Bean 
    public ClientHeaderPropagationInterceptor clientHeaderPropagationInterceptor() { 
     return new ClientHeaderPropagationInterceptor(); 
    } 

    @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(clientHeaderPropagationInterceptor())); 
     return restTemplate; 
    } 
+0

工程就像一個魅力,謝謝! – feicipet