我写了一个ClientHttpRequestInterceptor实现来自动将一些HttpHeaders插入到我的Spring Boot服务的任何传出请求中。
我要支持的标头之一是指示发送此请求的源应用程序。为此,我注入了" spring.application.name"将application属性转换为私有变量并使用该私有变量来设置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);
}
}
但是我得到了一个" null"上面的appName变量中的值。这是因为Interceptor在注入任何属性之前被初始化了吗?任何建议都将不胜感激。
Interceptor类从注入RestTemplate的@Bean插入到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 :(得分:1)
@Value
不适用于非托管的spring bean。首先,您需要对其进行弹簧管理。请尝试以下方法:
@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;
}