Java @EnableFeignClients和@FeignClient自动布线失败';装腔作势';无鼻孔感觉

Java @EnableFeignClients和@FeignClient自动布线失败';装腔作势';无鼻孔感觉,java,spring-boot,spring-cloud-netflix,spring-cloud-feign,feign,Java,Spring Boot,Spring Cloud Netflix,Spring Cloud Feign,Feign,我正在编写的微服务需要与我们平台中的其他微服务进行通信。在这一尝试中,我们的理想解决方案是Spring Cloud Netflix Faign,实现@FaignClient 但是,当我尝试一个@Autowired ReviewProvider时,我遇到了以下异常: 异常(原因) ReviewProvider.java @FeignClient("http://metadata-reviews") public interface ReviewProvider { @RequestMap

我正在编写的微服务需要与我们平台中的其他微服务进行通信。在这一尝试中,我们的理想解决方案是Spring Cloud Netflix Faign,实现
@FaignClient

但是,当我尝试一个
@Autowired ReviewProvider
时,我遇到了以下异常:

异常(原因)

ReviewProvider.java

@FeignClient("http://metadata-reviews")
public interface ReviewProvider {

    @RequestMapping(path = "sessions", method = POST)
    ReviewSessionDTO createSession();

}
@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());
    }
}
ReviewProvider.java

@FeignClient("http://metadata-reviews")
public interface ReviewProvider {

    @RequestMapping(path = "sessions", method = POST)
    ReviewSessionDTO createSession();

}
@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());
    }
}
@RunWith(SpringRunner.class)
@ActiveProfiles(集成)
@ContextConfiguration(类=AppEntry.class)
@AutoConfigureTestDatabase(replace=replace.NONE)
@DataJpaTest
公共类ReviewProviderTest{
@自动连线
私人审查提供者;

《私人课堂》似乎还没有关于这类问题的解决方案

以下是我为解决这个问题所做的: 1.将此批注添加到测试类:

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

试试看,如果它不起作用,您可能需要主程序配置上的
@enablefignclients
注释推荐的方法是切片应用程序配置,这意味着您需要从SpringBootApplication中删除
@enablefignclients

并添加专用配置类:

@Configuration
@EnableFeignClients
public class CloudConfiguration {

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

参考:


您唯一必须做的事情:

  • 例如,为gradle添加到构建文件中的伪依赖项
编译“org.springframework.cloud:springcloudstarterfeign”

  • 将@FeignClient添加到您的界面
  • 将@enablefignclients添加到任何配置或带有注释@springbootplication的类中

我通过在我的类上添加@EnableAutoConfiguration注释解决了这个问题

我也遇到了这个问题,我遵循了MariuszS的答案。但是,我必须找出两件事,所以放在这里……我们需要告诉@SpringBootTest从何处获取配置,所以会是这样

@SpringBootTest
@ContextConfiguration(classes = { YourClientConfig.class })

你是否尝试过添加
@enablefignclients
?是的,它在我的entrypoint类中。没有它,错误就不同了:它抱怨我的提供者没有符合条件的bean,而不是FaignContext。我从头开始重新构建了服务,所以还没有解决方案。我启用了enablefignclients…所以问题不是m谢谢你的跟进,虽然我的意思是,这真的会对其他人有帮助也许…我想原因真的与一些注释有关(我还不知道是什么…)这实际上阻止了导入FaignClient自动配置。因此我尝试导入它们。很抱歉听到您必须重建所有内容..[sad face],但这确实解决了我的问题。Spring Cloud Faign似乎有大量文档记录,而且很难测试(因为它不允许使用MockRestServiceServer)。我将继续使用它,并继续使用Spring Cloud Ribbon,它需要更多的编码,但感觉更可靠,文档记录也更好。我将把您的答案标记为解决方案,因为我不再对Spring Cloud佯装有任何理由或兴趣。感谢您的帮助!如果您不使用Ribbon,则只需要以下内容:
@ImportAutoConfiguration({FeignAutoConfiguration.class})
对于我来说,将
@enablefignclients
从应用程序移动到专用的
@Configuration
-注释类给的应用程序不工作。@ASten您确定在应用程序启动下扫描了您的配置吗?谢谢回答。我正在使用
@SpringBootApplication
,我在那里看到了
@ComponentScan
注释仅使用排除筛选器打开。我的
@Configuration
-带注释的类包含在应用程序上下文中(相关类发现它们已被注入)。这是否表明配置已被扫描?这是工作,谢谢