@EnableFeignClients и @FeignClient терпят неудачу при Autowiring '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());
    }
}

person hudsonmendes    schedule 29.03.2017    source источник
comment
Вы когда-нибудь пытались добавить @EnableFeignClients ?   -  person yongsung.yoon    schedule 30.03.2017
comment
Да, это в моем классе начального уровня. Без него ошибка другая: жалуется, что нет подходящего bean-компонента для моего провайдера, а не для FeignContext.   -  person hudsonmendes    schedule 30.03.2017


Ответы (5)


Похоже, что пока нет ничего о решении этой проблемы...

Вот что я сделал, чтобы решить эту проблему: 1. Добавьте эту аннотацию в свой тестовый класс:

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

Попробуйте, если это не сработает, вам может понадобиться аннотация @EnableFeignClients в вашей основной конфигурации программы.

person Codetector    schedule 25.05.2017
comment
Я перестроил сервис с нуля, поэтому пока не нашел решения для этого. И у меня был включен EnableFeignClients... Так что проблемы больше нет, но и реального решения проблемы нет. Спасибо за продолжение, подумал - person hudsonmendes; 25.05.2017
comment
Я имею в виду, что это действительно может помочь кому-то еще... Я решил, что причина действительно связана с некоторой аннотацией (я пока не знаю, что...), которая фактически предотвращает импорт автоматической конфигурации FeignClient. . Поэтому я попытался импортировать их. Жаль слышать, что вам нужно все перестроить.. [грустное лицо], но это решило мою проблему. - person Codetector; 26.05.2017
comment
Spring Cloud Feign кажется ужасно документированным и сложным для тестирования (поскольку он не позволяет использовать MockRestServiceServer). Я отказываюсь от его использования и перешел на Spring Cloud Ribbon, который требует немного больше кода, но кажется гораздо более надежным и лучше документирован. Я отмечу ваш ответ как решение, потому что у меня больше нет оснований или интереса к Spring Cloud Feign. Спасибо за помощь! - person hudsonmendes; 26.05.2017
comment
Если вы не используете Ribbon, то нужно только это: @ImportAutoConfiguration({FeignAutoConfiguration.class}) - person ordonezalex; 03.09.2020

Рекомендуемый подход — разделить конфигурацию приложения. Это означает, что вам нужно удалить @EnableFeignClients из SpringBootApplication.

и добавьте специальный класс конфигурации:

@Configuration
@EnableFeignClients
public class CloudConfiguration {

}

Это необходимо, поскольку все аннотации фрагментов (например, @WebMvcTest) включают конфигурацию по умолчанию из SpringBootApplication.

Ссылка:

person MariuszS    schedule 27.09.2017
comment
Для меня перемещение @EnableFeignClients из приложения в выделенный класс с аннотациями @Configuration привело к тому, что приложение не работает. - person ASten; 13.11.2019
comment
@ASten, вы уверены, что ваша конфигурация сканируется при запуске приложения? - person MariuszS; 13.11.2019
comment
Спасибо за ответы. Я использую @SpringBootApplication и вижу там аннотацию @ComponentScan только с фильтрами исключения. Мои классы с аннотациями @Configuration включены в контекст приложения (связанные классы нашли их внедренными). Показывает ли это, что конфигурация была отсканирована? - person ASten; 14.11.2019

Единственное, что вы должны сделать:

  • добавьте в свой файл сборки зависимость feign, например, для gradle

скомпилировать «org.springframework.cloud: spring-cloud-starter-feign»

  • добавьте @FeignClient в свой интерфейс
  • добавить @EnableFeignClients в любую конфигурацию или в класс с аннотацией @SpringBootApplication
person Ivan Osipov    schedule 20.12.2017

Я решил эту проблему только с помощью аннотации @EnableAutoConfiguration в моем классе.

person adramazany    schedule 21.08.2018
comment
это работа, спасибо - person zhaozhi; 04.02.2021

Я также столкнулся с этой проблемой, я последовал ответу MariuszS. Однако пришлось выяснить пару вещей, поэтому разместив здесь ... нам нужно сообщить @SpringBootTest, откуда взять конфигурацию, чтобы она была такой

@SpringBootTest
@ContextConfiguration(classes = { YourClientConfig.class })
person Vikky    schedule 25.05.2021