一、现象
使用@FeignClient进行服务间调用,某个特殊场景需要通过上下文获取bean,报错如下
java.util.concurrent.ExecutionException: org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'dataCenterService' available
二、解决方案
这个问题的原因没有深究,可能是原因可参考:SpringCloud之Feign(一)_无趣的码农-CSDN博客1
1、解决方案:
通过代码中的getFeignBean()去获取feign相关的bean
@Component
public class GetBeanUtils implements ApplicationContextAware {
private static ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
if (GetBeanUtils.applicationContext == null) {
GetBeanUtils.applicationContext = applicationContext;
}
}
public static ApplicationContext getApplicationContext() {
return applicationContext;
}
public static <T> T getBean(String beanName, Class<T> tClass) {
return applicationContext.getBean(beanName, tClass);
}
public static <T> T getFeignBean(String beanName, Class<T> tClass) {
FeignContext feignContext = applicationContext.getBean("feignContext", FeignContext.class);
return feignContext.getInstance(beanName, tClass);
}
}