SpringCloud - 整合Nacos启动报错Consider defining a bean of type IClientConfig

  • 前言
  • 一. 尝试解决Bug的几种不合适方案
    • 1.1 添加ribbon依赖
    • 1.2 按照提示增加IClientConfig配置
    • 1.3 正确答案

前言

我写了一套网关服务,一模一样的代码在自己电脑和公司电脑都写了一份。结果:

  • 公司电脑:启动报错。
  • 自己电脑:正常运行。

代码一模一样,最终发现,有一处不同:

  • 公司电脑:包名以com为开头。

  • 自己电脑:包名不是以com为开头。

最终启动报错如下:

再说结果之前,先说一下我从网上找过的各种解决方案。因为网上大多都是这几种方案,但是具体问题得具体分析。这里先排个雷(仅针对于包名为com的情况)

一. 尝试解决Bug的几种不合适方案

1.1 添加ribbon依赖

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
    <version>2.1.0.RELEASE</version>
</dependency>

添加后,依旧报错。不可行。

1.2 按照提示增加IClientConfig配置

在配置类中增加一个Bean

@Bean
public IClientConfig iClientConfig() {
    return new DefaultClientConfigImpl();
}

添加之后启动正常。但是!但是!但是我发送请求到网关,然后网关再进行转发的时候,就出大问题了:

详细信息:

  1. Error creating bean with name 'ribbonLoadBalancingHttpClient' defined in org.springframework.cloudflix.ribbon.apache.HttpClientRibbonConfiguration:
  2. Unsatisfied dependency expressed through method 'ribbonLoadBalancingHttpClient' parameter 2

也就是说创建ribbonLoadBalancingHttpClient这个Bean的时候出了问题。然后构造函数是有问题的。需要两个参数。具体原因不往下分析了。反正问题代码就出在上面的配置Bean

return new DefaultClientConfigImpl();

虽然增加它,可以避免启动错误,但是无法阻挡这种运行时错误,比如这种构造函数的调用出错。

1.3 正确答案

把上面几种方案都去除。然后将包名改为非com。原因:

  1. Nacos在启动的时候,就会扫描以com为开头的包。此时需要加载路径为comflix.client.config.IClientConfig的相关实例。
  2. 然后我们的包名恰恰以com为开头,可能优先扫描本地项目,就会发现找不到这个类,就会报错。无法启动。

当然,上面的是我的一个猜想,但是如果本地项目使用com为开头的话,肯定是存在一定的冲突的。

附带springcloudgithub相关问题IClientConfig找不到,官网上也有其他的解决方案。看看能不能帮到大家。

更多推荐

SpringCloud - 整合Nacos启动报错Consider defining a bean of type IClientConfig