在 Spring Boot 中找不到 DiscoveryClient bean 错误
Posted
技术标签:
【中文标题】在 Spring Boot 中找不到 DiscoveryClient bean 错误【英文标题】:cannot find DiscoveryClient bean error in spring boot 【发布时间】:2017-08-08 06:38:56 【问题描述】: 2017-03-16 16:09:08.821 INFO 9104 --- [main] com.hello.EurekaClientApplication:没有活动配置文件集,回退到默认配置文件:默认 2017-03-16 16:09:08.848 INFO 9104 --- [main] ationConfigEmbeddedWebApplicationContext:刷新 org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@5dcd8c7a:启动日期 [Thu Mar 16 16:09:08 CDT 2017];父:org.springframework.context.annotation.AnnotationConfigApplicationContext@441772e 2017-03-16 16:09:09.873 INFO 9104 --- [main] o.s.b.f.s.DefaultListableBeanFactory:用不同的定义覆盖 bean 'hystrixFeature' 的 bean 定义:替换 [Root bean: class [null];范围=;摘要=假;懒惰初始化=假;自动线模式=3;依赖检查=0;自动接线候选=真;主要=假; factoryBeanName=org.springframework.cloud.netflix.hystrix.HystrixCircuitBreakerConfiguration$HystrixWebConfiguration; factoryMethodName=hystrixFeature;初始化方法名=空; destroyMethodName=(推断);在类路径资源 [org/springframework/cloud/netflix/hystrix/HystrixCircuitBreakerConfiguration$HystrixWebConfiguration.class]] 中定义,带有 [Root bean: class [null];范围=;摘要=假;懒惰初始化=假;自动线模式=3;依赖检查=0;自动接线候选=真;主要=假; factoryBeanName=org.springframework.cloud.netflix.hystrix.HystrixCircuitBreakerConfiguration; factoryMethodName=hystrixFeature;初始化方法名=空; destroyMethodName=(推断);在类路径资源 [org/springframework/cloud/netflix/hystrix/HystrixCircuitBreakerConfiguration.class] 中定义 2017-03-16 16:09:10.364 WARN 9104 --- [main] o.s.c.a.ConfigurationClassPostProcessor:无法增强 @Configuration bean 定义“refreshScope”,因为它的单例实例创建得太早了。典型原因是具有 BeanDefinitionRegistryPostProcessor 返回类型的非静态 @Bean 方法:考虑将此类方法声明为“静态”。 2017-03-16 16:09:10.701 INFO 9104 --- [main] os.cloud.context.scope.GenericScope:BeanFactory id=d0eb8cfd-bd5b-3565-9f63-f671e896f6be 2017-03-16 16:09:10.736 INFO 9104 --- [main] f.a.AutowiredAnnotationBeanPostProcessor:发现并支持自动装配 JSR-330 'javax.inject.Inject' 注释 2017-03-16 16:09:11.312 INFO 9104 --- [main] trationDelegate$BeanPostProcessorChecker:[org.springframework.cloud.autoconfigure.ConfigurationPropertiesRebinderAutoConfiguration$$EnhancerBySpringCGLIB$ 类型的 Bean 'org.springframework.cloud.autoconfigure.ConfigurationPropertiesRebinderAutoConfiguration' $94394ff6] 不符合被所有 BeanPostProcessor 处理的条件(例如:不符合自动代理的条件) 2017-03-16 16:09:12.091 INFO 9104 --- [main] s.b.c.e.t.TomcatEmbeddedServletContainer:Tomcat 使用端口初始化:8080 (http) 2017-03-16 16:09:12.128 INFO 9104 --- [main] o.apache.catalina.core.StandardService:启动服务 Tomcat 2017-03-16 16:09:12.130 INFO 9104 --- [main] org.apache.catalina.core.StandardEngine:启动 Servlet 引擎:Apache Tomcat/8.5.11 2017-03-16 16:09:12.546 INFO 9104 --- [ost-startStop-1] o.a.c.c.C.[Tomcat].[localhost].[/]:初始化 Spring 嵌入式 WebApplicationContext 2017-03-16 16:09:12.547 INFO 9104 --- [ost-startStop-1] os.web.context.ContextLoader:根 WebApplicationContext:初始化在 3699 毫秒内完成 2017-03-16 16:09:13.191 信息 9104 --- [ost-startStop-1] o.s.b.w.servlet.ServletRegistrationBean:映射 servlet:'proxyStreamServlet' 到 [/proxy.stream] 2017-03-16 16:09:13.193 信息 9104 --- [ost-startStop-1] o.s.b.w.servlet.ServletRegistrationBean:映射 servlet:'dispatcherServlet' 到 [/] 2017-03-16 16:09:13.198 信息 9104 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean:映射过滤器:'metricsFilter' 到:[/*] 2017-03-16 16:09:13.199 信息 9104 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean:映射过滤器:'characterEncodingFilter' 到:[/*] 2017-03-16 16:09:13.199 INFO 9104 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean:映射过滤器:'hiddenHttpMethodFilter' 到:[/*] 2017-03-16 16:09:13.200 INFO 9104 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean:映射过滤器:“httpPutFormContentFilter”到:[/*] 2017-03-16 16:09:13.200 INFO 9104 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean:映射过滤器:'requestContextFilter' 到:[/*] 2017-03-16 16:09:13.200 INFO 9104 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean:映射过滤器:'webRequestLoggingFilter' 到:[/*] 2017-03-16 16:09:13.200 信息 9104 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean:映射过滤器:'applicationContextIdFilter' 到:[/*] 2017-03-16 16:09:13.269 WARN 9104 --- [main] ationConfigEmbeddedWebApplicationContext:上下文初始化期间遇到异常-取消刷新尝试:org.springframework.beans.factory.UnsatisfiedDependencyException:创建名为“eurekaClientApplication”的bean时出错:不满意通过字段“clientservice”表达的依赖关系;嵌套异常是 org.springframework.beans.factory.UnsatisfiedDependencyException:创建文件 [C:\Users\Mike\workspace\Eureka_client\target\classes\com\hello\ClientService.class] 中定义的名称为“clientService”的 bean 时出错:不满意通过构造函数参数 0 表示的依赖关系;嵌套异常是 org.springframework.beans.factory.NoSuchBeanDefinitionException:没有“com.netflix.discovery.DiscoveryClient”类型的合格 bean 可用:预计至少有 1 个有资格作为自动装配候选者的 bean。依赖注释: 2017-03-16 16:09:13.306 INFO 9104 --- [main] o.apache.catalina.core.StandardService:停止服务 Tomcat 2017-03-16 16:09:13.404 信息 9104 --- [主要] utoConfigurationReportLoggingInitializer: 启动 ApplicationContext 时出错。要显示自动配置报告,请在启用“调试”的情况下重新运行您的应用程序。 2017-03-16 16:09:13.745 错误 9104 --- [主要] o.s.b.d.LoggingFailureAnalysisReporter: ****************************** 应用程序无法启动 ****************************** 描述: com.hello.ClientService 中构造函数的参数 0 需要找不到类型为“com.netflix.discovery.DiscoveryClient”的 bean。 行动: 考虑在您的配置中定义“com.netflix.discovery.DiscoveryClient”类型的 bean。package com.hello;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.stereotype.Service;
import com.netflix.discovery.DiscoveryClient;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
@EnableDiscoveryClient
@Service
public class ClientService
private final DiscoveryClient disc;
public ClientService(DiscoveryClient disc)
this.disc=disc;
@HystrixCommand(fallbackMethod="disp")
public String serviceInstancesByApplicationName()
return this.disc.getInstancesById("a-bootiful-client").toString();
public String disp()
return "This is fall back method";
package com.hello;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.SpringBootConfiguration;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.client.RestTemplateBuilder;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.netflix.hystrix.EnableHystrix;
import org.springframework.cloud.netflix.hystrix.dashboard.EnableHystrixDashboard;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
@EnableHystrix
@EnableHystrixDashboard
@EnableDiscoveryClient
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan
@RestController
public class EurekaClientApplication
@Autowired
private ClientService clientservice;
public static void main(String[] args)
SpringApplication.run(EurekaClientApplication.class, args);
@RequestMapping("/serv")
public String serviceInstancesByApplicationName()
return clientservice.serviceInstancesByApplicationName();
我正在尝试创建一个简单的 eureka 服务和客户端程序并在其上启用 hystrix。但我在代码上收到此错误
【问题讨论】:
SO 不是调试服务。请添加说明您为调查您的问题所做的尝试的文字。解释你的代码的哪一部分似乎按照你想要的方式工作,哪一部分没有。表现出你的一些努力,否则看起来你只是转储一个大错误消息并期望人们为你调试你的代码。 【参考方案1】:这可能是因为 2 个案例。
1:第一种情况是导入的包是否不匹配
如果您使用 @EnableDiscoveryClient
import org.springframework.cloud.client.discovery.DiscoveryClient
“代替 ”
com.netflix.discovery.DiscoveryClient
如果您使用 @EnableEurekaClient,请在下面导入
import org.springframework.cloud.netflix.eureka.EnableEurekaClient
2:我在创建模块时没有选择starer-web
依赖项,在pom.xml 和rebuild
中添加了以下依赖项 项目来获取添加的依赖项。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
【讨论】:
【参考方案2】:我也遇到了同样的问题,添加spring boot-starter-web依赖后解决了
【讨论】:
【参考方案3】:使用com.netflix.discovery.EurekaClient
代替com.netflix.discovery.DiscoveryClient
。这是 Netflix 提供的发现客户端。
如果您想使用 spring discovery 客户端,请按照@yongsung.yoon 的建议使用org.springframework.cloud.client.discovery.DiscoveryClient
【讨论】:
【参考方案4】:您在代码中导入了错误的 DiscoveryClient
类。来自 netflix 的 DiscoveryClient 不作为 Spring Bean 提供。所以你应该使用 spring-cloud 中的一个。
尝试在 ClientService
类中导入 org.springframework.cloud.client.discovery.DiscoveryClient
而不是 com.netflix.discovery.DiscoveryClient
。
您还需要将this.disc.getInstancesById("a-bootiful-client")
更改为this.disc.getInstances(...)
。
【讨论】:
以上是关于在 Spring Boot 中找不到 DiscoveryClient bean 错误的主要内容,如果未能解决你的问题,请参考以下文章
Maven-在当前项目和插件组中找不到前缀“spring-boot”的插件
Spring在基本的Spring Boot应用程序中找不到bean [重复]
Spring Boot 2.0.0,在自动配置 jar 中找不到 DataSourceBuilder