使用Interceptor自动连接RibbonAware RestTemplate

时间:2017-05-25 04:24:18

标签: spring spring-boot

我有一个包装器,自动装配功能区识别RestTemplate,然后我添加一个拦截器 -

@Component
public class MyRestTemplate {

    @Autowired
    private RestTemplate restTemplate;

    @PostConstruct
    public void init(){
        restTemplate.setInterceptors(Collections.singletonList(new 
        MyRestTemplateRequestInterceptor(applicationName)));
    }   
}

如果我在其他组件中使用@AutoWire RestTemplate,我是否会使用此incterceptor获取相同的RestTemplate实例?我的观察结果是其他组件中的autowired resttemplate也添加了这个拦截器。请帮助验证理解。

1 个答案:

答案 0 :(得分:0)

你会得到相同的RestTemplate实例。当bean MyRestTemplate是构造函数(而不是它的构造之后)时,你将MyRestTemplateRequestInterceptor添加到RestTemplate拦截器。 所以这个拦截器将应用于RestTemplate。 如果您希望为特定的假装客户端应用拦截器,您可以创建自己的配置:

@Configuration
@IgnoreDuringScan
public class FeignClientConfiguration {

    @Autowired
    private Environment environment;

    @Bean
    public Encoder feignEncoder() {
        return new GsonEncoder();
    }


    @Bean
    public ErrorDecoder feignDecoder() {
       return new GsonDecoder();
    }

    @Bean
    public RequestInterceptor requestHeaderInterceptor() {
        return new RequestInterceptor() {
            @Override
            public void apply(RequestTemplate requestTemplate) {
                //impl
            }
        };
    }

    @Bean
    public Feign.Builder feingBuilder() {
        return Feign.builder().encoder(feignEncoder()).decoder(feignDecoder()).errorDecoder(new YourErrorDecoder())
            .requestInterceptor(requestHeaderInterceptor);
    }

}

然后将配置应用于假装客户端:

@FeignClient(name = "myFeign", url = "url/...", configuration = {
 FeignClientConfiguration.class
})
public interface YourFeignClient {
    //....
}