web-dev-qa-db-fra.com

@EnableFeignClients et @FeignClient échouent lors de l'autotransfert de l'authentification 'FeignContext'

Le microservice que j'écris doit communiquer avec les autres microservices de notre plateforme. Sur cette tentative, la solution idéale pour nous est Spring Cloud Netflix Feign , implémentant un@FeignClient.

Cependant, je suis confronté à l'exception ci-dessous lorsque j'essaie un @Autowired ReviewProvider:

Exception (cause)

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
hudsonmendes

On dirait qu'il n'y a pas encore de solution de rechange à ce problème ...

Voici ce que j'ai fait pour résoudre ceci: 1. Ajoutez cette annotation à votre classe de test:

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

Essayez, si cela ne fonctionne pas, vous aurez peut-être besoin de l'annotation @EnableFeignClients sur la configuration de votre programme principal

6
Codetector

L'approche recommandée consiste à slice application configuration, cela signifie que vous devez supprimer @EnableFeignClients de SpringBootApplication.

et ajouter une classe de configuration dédiée:

@Configuration
@EnableFeignClients
public class CloudConfiguration {

}

Cela est obligatoire, car toutes les annotations de tranches (telles que @WebMvcTest) incluent la configuration par défaut de SpringBootApplication

Référence: 

4
MariuszS

Le seul que vous devez faire:

  • ajouter à votre fichier de construction une feinte dépendance, par exemple, pour gradle

compiler 'org.springframework.cloud:spring-cloud-starter-feign'

  • ajoutez @FeignClient à votre interface
  • ajoutez @EnableFeignClients à n'importe quelle configuration ou classe avec l'annotation @SpringBootApplication
1
Ivan Osipov

J'ai résolu ce problème simplement par l'annotation @EnableAutoConfiguration sur ma classe

1
adramazany