@EnableFeignClients和@FeignClient在自动assembly’FeignContext’NoSuchBeanException时失败

我正在编写的微服务需要与我们平台中的其他微服务进行通信。 在这次尝试中,我们的理想解决方案是Spring Cloud Netflix Feign ,实现@FeignClient

但是,当我尝试@Autowired ReviewProvider时,我正面临下面的例外:

例外(原因)

 Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'org.springframework.cloud.netflix.feign.FeignContext' available at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:353) at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:351) at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:340) at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1093) at org.springframework.cloud.netflix.feign.FeignClientFactoryBean.getObject(FeignClientFactoryBean.java:155) at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.doGetObjectFromFactoryBean(FactoryBeanRegistrySupport.java:168) 

ReviewProvider.java

 @FeignClient("http://metadata-reviews") public interface ReviewProvider { @RequestMapping(path = "sessions", method = POST) ReviewSessionDTO createSession(); } 

ReviewProvider.java

 @RunWith(SpringRunner.class) @ActiveProfiles(INTEGRATION) @ContextConfiguration(classes = AppEntry.class) @AutoConfigureTestDatabase(replace = Replace.NONE) @DataJpaTest public class ReviewProviderTest { @Autowired private ReviewProvider provider; private Class providerClass; @Before public void setup() { providerClass = provider.getClass(); } @Test public void classAnnotations() { assertTrue(providerClass.isAnnotationPresent(FeignClient.class)); assertEquals("http://metadata-reviews", providerClass.getAnnotation(FeignClient.class).value()); } @Test public void createSession() throws Exception { final Method method = providerClass.getDeclaredMethod("createSession"); assertTrue(method.isAnnotationPresent(RequestMapping.class)); final RequestMapping mapping = method.getAnnotation(RequestMapping.class); assertEquals("sessions", mapping.path()); assertEquals(0, method.getParameters().toString()); } } 

似乎没有任何关于这个东西的解决方案……

以下是我为解决此问题所做的工作:1。将此注释添加到测试类中:

 @ImportAutoConfiguration({RibbonAutoConfiguration.class, FeignRibbonClientAutoConfiguration.class, FeignAutoConfiguration.class}) 

尝试一下,如果它不起作用,您可能需要在主程序配置上使用@EnableFeignClients注释

建议的方法是切片应用程序配置 ,这意味着您需要从SpringBootApplication中删除@EnableFeignClients

并添加专用配置类:

 @Configuration @EnableFeignClients public class CloudConfiguration { } 

这是必需的,因为所有切片注释(如@WebMvcTest)都包含SpringBootApplication的默认配置。

参考:

我只是通过我class上的@EnableAutoConfiguration注释来解决这个问题

唯一必须做的事情:

  • 添加到您的构建文件假装依赖项,例如,对于gradle

编译’org.springframework.cloud:spring-cloud-starter-feign’

  • 将@FeignClient添加到您的界面
  • 将@EnableFeignClients添加到任何配置或带有注释@SpringBootApplication的类