programing

@EnableFeignClients 및 @FeignClients가 'FeignContext' 자동 배선 시 실패함 No SuchBeanException

kingscode 2023. 7. 20. 23:07
반응형

@EnableFeignClients 및 @FeignClients가 'FeignContext' 자동 배선 시 실패함 No SuchBeanException

제가 쓰고 있는 마이크로 서비스는 우리 플랫폼의 다른 마이크로 서비스와 통신해야 합니다.이러한 시도에서 당사에 이상적인 솔루션은 Spring Cloud Netflix Feign을 구현하는 입니다.

하지만, 아래의 예외 사항에 직면해 있습니다.@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. 이 주석을 테스트 클래스에 추가합니다.

    @자동 구성 가져오기({Ribbon)AutoConfiguration.class, FeignRibbonClientAutoConfiguration.class, FeignAutoConfiguration.class}

시도해 보세요, 만약 그것이 작동하지 않는다면, 당신은 아마도 필요할 것입니다.@EnableFeignClients주 프로그램 구성에 대한 주석

권장되는 접근 방식은 애플리케이션 구성을 슬라이스하는 이며, 이는 제거해야 함을 의미합니다.@EnableFeignClientsSpringBootApplication에서.

전용 구성 클래스를 추가합니다.

@Configuration
@EnableFeignClients
public class CloudConfiguration {

}

@WebMvcTest와 같은 모든 슬라이스 주석에는 SpringBootApplication의 기본 구성이 포함되어 있기 때문에 이 작업이 필요합니다.

참조:

저는 이 문제를 단지 하나로 해결했습니다.@EnableAutoConfiguration나의 수업에 대한 주석

해야 할 일은 다음과 같습니다.

  • 빌드 파일에 그라들(gradle)과 같은 유사한 종속성을 추가합니다.

'compile.springframework.cloud:spring-cloud-spring-feign'

  • 인터페이스에 @FeignClient 추가
  • @EnableFeignClients를 주석 @SpringBootApplication이 있는 클래스 또는 구성에 추가합니다.

저는 또한 이 문제에 직면했습니다. 저는 MariuszS의 답변을 따랐습니다.하지만 몇 가지를 알아내야 했기 때문에 여기에...우리는 @SpringBoot에게 말해야 합니다.다음과 같이 구성을 선택할 위치에서 테스트합니다.

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

기본 패키지 및 구성을 추가해야 했습니다.

@Configuration
@EnableFeignClients( basePackages = ["com.yourcompany.yourproject"])
internal open class FeignConfiguration

언급URL : https://stackoverflow.com/questions/43093968/enablefeignclients-and-feignclient-fail-on-autowiring-feigncontext-nosuchbea

반응형