Application属性未注入ClientHttpRequestInterceptor中的私有变量

时间:2017-05-28 03:59:51

标签: spring spring-boot resttemplate clienthttprequest

我写了一个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变量仍为空。

1 个答案:

答案 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;
    }