'Global' Feign 拦截器未被所有 Feign 客户端接收
'Global' Feign Interceptor not picked up by all Feign Clients
我们在我们的应用程序中使用 Open Feign,它是 运行 on Spring Boot 2.0.6 和 Spring Cloud Finchley.SR2。
我们需要所有 Feign 客户端在每次调用的 header 中从安全上下文添加令牌,因此我们创建了一个配置,它为所有客户端生成一个全局拦截器:
@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 客户端。在调试器中我们可以看到,创建了这个特殊的假客户端(连同它的 SynchronousMessageHandler),before 在 classFeignConfig
中创建了 Bean。 CustomIntercepter
仅在第一个 Feign Client 之后创建,所有其他客户端都在之后创建,知道拦截器的存在并将应用它。
我们如何调试这个问题?过去有没有人遇到过不同的问题?
我不能 post 生产代码,但我很乐意回答任何问题并尝试 post 混淆代码。
这表明在创建第一个客户端时创建拦截器时存在问题。
尝试在 RequestInterceptor.class
上的 org.springframework.beans.factory.support.DefaultListableBeanFactory#getBeansOfType
中放置一个条件断点。您可能会看到存在循环依赖关系,它要求在实例化 FeignConfig
或 CustomInterceptor
类 之前创建第一个客户端。
考虑以下示例:
@Configuration
@EnableFeignClients(
clients = {
MyFirstClient.class, // will NOT have CustomInterceptor registered
MySecondClient.class // will have CustomInterceptor registered
})
public class FeignConfig {
@Autowired
private BeanDependentOnMyFirstClient beanDependentOnMyFirstClient;
@Bean
public RequestInterceptor myCustomInterceptor() {
return new CustomInterceptor();
}
}
这将导致以下循环依赖:
由于客户端和拦截器之间的依赖性很弱,如果不能满足依赖性,它就会静默失败。
我们在我们的应用程序中使用 Open Feign,它是 运行 on Spring Boot 2.0.6 和 Spring Cloud Finchley.SR2。
我们需要所有 Feign 客户端在每次调用的 header 中从安全上下文添加令牌,因此我们创建了一个配置,它为所有客户端生成一个全局拦截器:
@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 客户端。在调试器中我们可以看到,创建了这个特殊的假客户端(连同它的 SynchronousMessageHandler),before 在 classFeignConfig
中创建了 Bean。 CustomIntercepter
仅在第一个 Feign Client 之后创建,所有其他客户端都在之后创建,知道拦截器的存在并将应用它。
我们如何调试这个问题?过去有没有人遇到过不同的问题?
我不能 post 生产代码,但我很乐意回答任何问题并尝试 post 混淆代码。
这表明在创建第一个客户端时创建拦截器时存在问题。
尝试在 RequestInterceptor.class
上的 org.springframework.beans.factory.support.DefaultListableBeanFactory#getBeansOfType
中放置一个条件断点。您可能会看到存在循环依赖关系,它要求在实例化 FeignConfig
或 CustomInterceptor
类 之前创建第一个客户端。
考虑以下示例:
@Configuration
@EnableFeignClients(
clients = {
MyFirstClient.class, // will NOT have CustomInterceptor registered
MySecondClient.class // will have CustomInterceptor registered
})
public class FeignConfig {
@Autowired
private BeanDependentOnMyFirstClient beanDependentOnMyFirstClient;
@Bean
public RequestInterceptor myCustomInterceptor() {
return new CustomInterceptor();
}
}
这将导致以下循环依赖:
由于客户端和拦截器之间的依赖性很弱,如果不能满足依赖性,它就会静默失败。