12

我正在编写的微服务需要与我们平台中的其他微服务进行通信。在那次尝试中,对我们来说理想的解决方案是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());
    }
}
4

5 回答 5

23

似乎还没有关于这些东西的解决方案的任何东西......

这是我为解决这个问题所做的:

  1. 将此注释添加到您的测试类:

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

试试看,如果它不起作用,您可能需要在@EnableFeignClients主程序配置上添加注释

于 2017-05-25T02:47:47.203 回答
10

推荐的方法是对应用程序配置进行切片,这意味着您需要 @EnableFeignClientsSpringBootApplication中删除。

并添加专用配置类:

@Configuration
@EnableFeignClients
public class CloudConfiguration {

}

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

参考:

于 2017-09-27T13:59:40.370 回答
1

您必须做的唯一事情:

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

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

  • 将@FeignClient 添加到您的界面
  • 将@EnableFeignClients 添加到任何配置或带有注释@SpringBootApplication 的类
于 2017-12-20T03:52:14.143 回答
1

@EnableAutoConfiguration我只是通过在课堂上添加注释来解决这个问题

于 2018-08-21T05:27:10.410 回答
0

我也遇到了这个问题,我遵循 MariuszS 的回答。但是必须弄清楚一些事情所以放在这里......我们需要告诉@SpringBootTest从哪里获取配置,所以它会是这样的

@SpringBootTest
@ContextConfiguration(classes = { YourClientConfig.class })
于 2021-05-25T19:15:07.433 回答