Сбой @EnableFeignClients и @FeignClient при автопроводке '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<? 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());
}
}
6 ответов
Похоже, что пока нет ничего о решении этого материала...
Вот что я сделал, чтобы решить эту проблему: 1. Добавьте эту аннотацию в ваш тестовый класс:
@ImportAutoConfiguration({RibbonAutoConfiguration.class, FeignRibbonClientAutoConfiguration.class, FeignAutoConfiguration.class})
Попробуйте, если это не работает, вам может понадобиться @EnableFeignClients
аннотации в вашей основной конфигурации программы
Рекомендуемый подход заключается в нарезке конфигурации приложения, это означает, что вам нужно удалить @EnableFeignClients
от SpringBootApplication.
и добавьте выделенный класс конфигурации:
@Configuration
@EnableFeignClients
public class CloudConfiguration {
}
Это необходимо, потому что аннотация всех срезов (например, @WebMvcTest) включает конфигурацию по умолчанию из SpringBootApplication.
Ссылка:
Я решил эту проблему просто аннотацией @EnableAutoConfiguration на моем классе
Единственное, что вы должны сделать:
- добавьте в свой файл сборки симметричную зависимость, например, для gradle
скомпилируйте org.springframework.cloud:spring-cloud-starter-feign'
- добавьте @FeignClient в ваш интерфейс
- добавьте @EnableFeignClients в любую конфигурацию или в класс с аннотацией @SpringBootApplication
Мне пришлось добавить базовые пакеты и конфигурацию
@Configuration
@EnableFeignClients( basePackages = ["com.yourcompany.yourproject"])
internal open class FeignConfiguration
Я также столкнулся с этой проблемой, я последовал за ответом MariuszS. Однако пришлось выяснить несколько вещей, поэтому, помещая сюда ... нам нужно указать @SpringBootTest, откуда брать конфигурацию, чтобы это было так
@SpringBootTest
@ContextConfiguration(classes = { YourClientConfig.class })