Сбой @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 })
Другие вопросы по тегам