并非所有Feign客户都可以使用“全球” Feign拦截器

时间:2019-04-25 17:13:53

标签: java spring-boot spring-cloud-feign

我们在应用程序中使用Open Feign,该应用程序在Spring Boot 2.0.6和Spring Cloud Finchley.SR2上运行。

我们需要所有Feign客户端在每个调用的头中从安全上下文中添加令牌,因此我们创建了一个配置,该配置为所有客户端生成一个全局拦截器:

@Configuration
@Import({FeignClientsConfiguration.class})
public class FeignConfig {

   @Value("${a.spring.config}")
   private int minTokenLifespan;

   @Autowired
   private OAuthContext oAuthContext;

   @Autowired
   private AuthManager authManager;

   @Bean
   public RequestInterceptor myCustomInterceptor() {
       return new CustomInterceptor(oAuthContext, authManager, minTokenLifespan);
   }
}

拦截器适用于除一个外的所有Feign客户。在调试器中,我们可以看到,在类FeignConfig中创建Bean之前,在之前创建了这个特殊的伪客户端(及其SynchronousMessageHandler)。 CustomIntercepter仅在第一个Feign客户之后创建,所有其他客户都在之后创建,知道拦截器的存在并将应用它。

我们如何调试此问题?过去有人遇到过其他问题吗?

我无法发布生产代码,但我很乐意回答任何问题并尝试发布混淆的代码。

1 个答案:

答案 0 :(得分:2)

这指向在创建第一个客户端时创建拦截器的问题。

尝试在org.springframework.beans.factory.support.DefaultListableBeanFactory#getBeansOfType的{​​{1}}中放置条件断点。您可能会发现存在循环依赖关系,这需要在实例化RequestInterceptor.classFeignConfig类之前创建第一个客户端。

考虑以下示例:

CustomInterceptor

这将导致以下循环依赖性:

enter image description here

由于客户端和拦截器之间的依赖关系很弱,因此如果无法满足依赖关系,它将仅以静默方式失败。