web-dev-qa-db-ja.com

@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());
    }
}
9
hudsonmendes

このようなものの解決策についてはまだ何もないようです...

これを解決するために私がしたことは次のとおりです。1.この注釈をテストクラスに追加します。

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

試してみてください。うまくいかない場合は、@EnableFeignClientsメインプログラム設定の注釈

10
Codetector

推奨されるアプローチは、アプリケーション構成のスライスです。つまり、SpringBootApplicationから@EnableFeignClientsを削除する必要があります。

専用の構成クラスを追加します。

@Configuration
@EnableFeignClients
public class CloudConfiguration {

}

これは、すべてのスライスアノテーション(@WebMvcTestなど)にSpringBootApplicationのデフォルト設定が含まれているために必要です。

参照:

7
MariuszS

あなたがしなければならない唯一のこと:

  • gradleの場合など、ビルドファイルに偽の依存関係を追加します。

'org.springframework.cloud:spring-cloud-starter-feign'をコンパイルします

  • インターフェイスに@FeignClientを追加します
  • @EnableFeignClientsを@SpringBootApplicationアノテーションを付けて任意の構成またはクラスに追加します
1
Ivan Osipov

クラスの@EnableAutoConfigurationアノテーションだけでこの問題を解決しました

0
adramazany