SpringCloud项目启动报错,NoUniqueBeanDefinitionException

springboot版本:2.2.4.RELEASE
springcloud版本:Hoxton.SR9

启动springcloud项目报错:

Field feignService in com.example.client.web.WebController required a single bean, but 2 were found:
    - loadBalancedRetryPolicyFactory: defined by method 'loadBalancedRetryPolicyFactory' in class path resource [org/springframework/cloud/netflix/ribbon/RibbonAutoConfiguration.class]
    - loadBalancedRetryFactory: defined by method 'loadBalancedRetryFactory' in class path resource [org/springframework/cloud/loadbalancer/config/BlockingLoadBalancerClientAutoConfiguration$BlockingLoadbalancerClientConfig$BlockingLoadBalancerRetryConfig.class]

详细信息

2023-09-03 15:29:52.946  WARN [client,,,] 32552 --- [  restartedMain] ConfigServletWebServerApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'webController': Unsatisfied dependency expressed through field 'feignService'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'com.example.client.service.FeignService': FactoryBean threw exception on object creation; nested exception is org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'org.springframework.cloud.client.loadbalancer.LoadBalancedRetryFactory' available: expected single matching bean but found 2: loadBalancedRetryPolicyFactory,loadBalancedRetryFactory
2023-09-03 15:29:52.948  INFO [client,,,] 32552 --- [  restartedMain] o.s.s.c.ThreadPoolTaskScheduler          : Shutting down ExecutorService 'taskScheduler'
2023-09-03 15:29:52.955  INFO [client,,,] 32552 --- [  restartedMain] com.alibaba.druid.pool.DruidDataSource   : {dataSource-1} closed
2023-09-03 15:29:53.962  WARN [client,,,] 32552 --- [  restartedMain] z.r.AsyncReporter$BoundedAsyncReporter   : Timed out waiting for in-flight spans to send
2023-09-03 15:29:53.964  INFO [client,,,] 32552 --- [  restartedMain] o.apache.catalina.core.StandardService   : Stopping service [Tomcat]
2023-09-03 15:29:53.968  WARN [client,,,] 32552 --- [  restartedMain] o.a.c.loader.WebappClassLoaderBase       : The web application [client] appears to have started a thread named [RxIoScheduler-1 (Evictor)] but has failed to stop it. This is very likely to create a memory leak. Stack trace of thread:
 sun.misc.Unsafe.park(Native Method)
 java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:215)
 java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:2078)
 java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:1093)
 java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:809)
 java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1067)
 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1127)
 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
 java.lang.Thread.run(Thread.java:745)
2023-09-03 15:29:53.968  WARN [client,,,] 32552 --- [  restartedMain] o.a.c.loader.WebappClassLoaderBase       : The web application [client] appears to have started a thread named [spring.cloud.inetutils] but has failed to stop it. This is very likely to create a memory leak. Stack trace of thread:
 java.net.Inet6AddressImpl.getHostByAddr(Native Method)
 java.net.InetAddress$2.getHostByAddr(InetAddress.java:932)
 java.net.InetAddress.getHostFromNameService(InetAddress.java:617)
 java.net.InetAddress.getHostName(InetAddress.java:559)
 java.net.InetAddress.getHostName(InetAddress.java:531)
 org.springframework.cloud.commons.util.InetUtils$$Lambda$109/666823162.call(Unknown Source)
 java.util.concurrent.FutureTask.run$$$capture(FutureTask.java:266)
 java.util.concurrent.FutureTask.run(FutureTask.java)
 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
 java.lang.Thread.run(Thread.java:745)
2023-09-03 15:29:53.984  INFO [client,,,] 32552 --- [  restartedMain] ConditionEvaluationReportLoggingListener : 

Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.
2023-09-03 15:29:53.993 ERROR [client,,,] 32552 --- [  restartedMain] o.s.b.d.LoggingFailureAnalysisReporter   : 

***************************
APPLICATION FAILED TO START
***************************

Description:

Field feignService in com.example.client.web.WebController required a single bean, but 2 were found:
    - loadBalancedRetryPolicyFactory: defined by method 'loadBalancedRetryPolicyFactory' in class path resource [org/springframework/cloud/netflix/ribbon/RibbonAutoConfiguration.class]
    - loadBalancedRetryFactory: defined by method 'loadBalancedRetryFactory' in class path resource [org/springframework/cloud/loadbalancer/config/BlockingLoadBalancerClientAutoConfiguration$BlockingLoadbalancerClientConfig$BlockingLoadBalancerRetryConfig.class]


Action:

Consider marking one of the beans as @Primary, updating the consumer to accept multiple beans, or using @Qualifier to identify the bean that should be consumed

Disconnected from the target VM, address: '127.0.0.1:48477', transport: 'socket'

Process finished with exit code 0

相关的文件

FeignService

@FeignClient(value = "client-2")
public interface FeignService {

    @GetMapping("/client/callClient")
    String callClient();
}

启动类

@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients
@EnableHystrix
@EnableHystrixDashboard
public class ClientApplication {

    public static void main(String[] args) {
        SpringApplication.run(ClientApplication.class);
    }

}

pom文件依赖

<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-zipkin</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-web</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-config</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-bus-amqp</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-bootstrap</artifactId>
            <version>4.0.2</version>
        </dependency>
        <!-- 客户端包 -->
        <dependency>
            <groupId>de.codecentric</groupId>
            <artifactId>spring-boot-admin-client</artifactId>
            <version>${spring.boot.admin.version}</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.1.9</version>
        </dependency>
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.5.3.1</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
    </dependencies>

最后还是自己解决的,泪目了

No qualifying bean of type 'org.springframework.cloud.client.loadbalancer.LoadBalancedRetryFactory' available: expected single matching bean but found 2: loadBalancedRetryPolicyFactory,loadBalancedRetryFactory

出错原因是创建FeignService的过程中,因为用到了ribbon负载均衡,在LoadBalancedRetryFactory实例化的时候发现了两个相同匹配的bean,没有指定某一个bean,所以报了错。

解决方案:
在FeignService上加上qualifier = "loadBalancedRetryFactory"(我是随便加的,也不清楚换另一个有什么区别)


@FeignClient(value = "client-2",qualifier = "loadBalancedRetryFactory")
public interface FeignService {

    @GetMapping("/client/callClient")
    String callClient();
}

引用 皆我百晓生 小程序回复内容作答:

这个报错是因为在FeignService接口中,使用了@FeignClient注解,并且指定了value = "client-2",表示要调用名为client-2的服务。但是启动时发现有两个符合条件的bean,具体是loadBalancedRetryPolicyFactoryloadBalancedRetryFactory

解决这个问题有几种方法:

  1. 标记其中一个bean为主要的(Primary)。在FeignService接口中添加@Qualifier注解指定要使用的bean。例如:
@FeignClient(value = "client-2")
public interface FeignService {

    @Qualifier("loadBalancedRetryFactory")
    @GetMapping("/client/callClient")
    String callClient();
}
  1. 在启动类中使用@Primary注解标记其中一个bean。例如:
@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients
@EnableHystrix
@EnableHystrixDashboard
public class ClientApplication {

    @Primary
    @Bean
    public LoadBalancedRetryFactory loadBalancedRetryFactory() {
        // 返回loadBalancedRetryFactory的实例
    }

    public static void main(String[] args) {
        SpringApplication.run(ClientApplication.class);
    }

}
  1. 更新FeignService接口,使其接受多个bean。例如:
@FeignClient(value = "client-2", contextId = "feignService")
public interface FeignService {

    @GetMapping("/client/callClient")
    String callClient();

}

然后在调用FeignService的地方使用@Qualifier注解指定要使用的bean。

以上是几种解决方案,你可以根据具体情况选择合适的方法解决问题。