私が書いているマイクロサービスは、プラットフォーム内の他のマイクロサービスと通信する必要があります。その試みで、私たちにとって理想的な解決策は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());
}
}
このようなものの解決策についてはまだ何もないようです...
これを解決するために私がしたことは次のとおりです。1.この注釈をテストクラスに追加します。
@ImportAutoConfiguration({RibbonAutoConfiguration.class, FeignRibbonClientAutoConfiguration.class, FeignAutoConfiguration.class})
試してみてください。うまくいかない場合は、@EnableFeignClients
メインプログラム設定の注釈
推奨されるアプローチは、アプリケーション構成のスライスです。つまり、SpringBootApplicationから@EnableFeignClients
を削除する必要があります。
専用の構成クラスを追加します。
@Configuration
@EnableFeignClients
public class CloudConfiguration {
}
これは、すべてのスライスアノテーション(@WebMvcTestなど)にSpringBootApplicationのデフォルト設定が含まれているために必要です。
参照:
あなたがしなければならない唯一のこと:
'org.springframework.cloud:spring-cloud-starter-feign'をコンパイルします
クラスの@EnableAutoConfigurationアノテーションだけでこの問題を解決しました