应用程序 属性 未注入 ClientHttpRequestInterceptor 中的私有变量
Application property not injected into private variable in ClientHttpRequestInterceptor
我编写了一个 ClientHttpRequestInterceptor 实现来自动将一些 HttpHeaders 插入到来自我的 Spring 引导服务的任何传出请求中。
我要支持的 headers 之一是指明发送此请求的源应用程序。为此,我将 "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" 值。这是因为拦截器在任何属性可以被注入之前被初始化了吗?任何建议将不胜感激。
拦截器class从注入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 变量仍然为空。
@Value
不适用于非托管 spring beans。首先,您需要对其进行管理 spring。尝试以下操作:
@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;
}
我编写了一个 ClientHttpRequestInterceptor 实现来自动将一些 HttpHeaders 插入到来自我的 Spring 引导服务的任何传出请求中。
我要支持的 headers 之一是指明发送此请求的源应用程序。为此,我将 "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" 值。这是因为拦截器在任何属性可以被注入之前被初始化了吗?任何建议将不胜感激。
拦截器class从注入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 变量仍然为空。
@Value
不适用于非托管 spring beans。首先,您需要对其进行管理 spring。尝试以下操作:
@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;
}