El microservicio que estoy escribiendo necesita comunicarse con otros microservicios en nuestra plataforma. En ese intento, la solución ideal para nosotros es Spring Cloud Netflix Feign , implementando un @FeignClient .
Sin embargo, me enfrento a la siguiente excepción cuando pruebo un @Autowired ReviewProvider :
excepción (causa)
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<? extends ReviewProvider> 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()); } }Parece que todavía no hay nada sobre la solución a este problema...
Esto es lo que hice para resolver esto:
Agregue esta anotación a su clase de prueba:
@ImportAutoConfiguration({RibbonAutoConfiguration.class, FeignRibbonClientAutoConfiguration.class, FeignAutoConfiguration.class})
Pruébelo, si no funciona, es posible que necesite la anotación @EnableFeignClients en la configuración de su programa principal
El enfoque recomendado es dividir la configuración de la aplicación , lo que significa que debe eliminar @EnableFeignClients de SpringBootApplication .
y agregue una clase de configuración dedicada:
@Configuration @EnableFeignClients public class CloudConfiguration { }Esto es obligatorio porque todas las anotaciones de sectores (como @WebMvcTest) incluyen la configuración predeterminada de SpringBootApplication .
Referencia:
Resolví este problema simplemente con la anotación @EnableAutoConfiguration en mi clase