springcloud笔记:问题及解决汇总

intellj idea调试springcloud的配置

springcloud项目搭建好后,项目列表有很多项目,如图1,如果要一个项目一个项目的找到启动类再打开会很繁琐,因此可以借助intellij idea的Run Dashboard面板,下面是配置方法。

图1 项目列表

  1. 将项目列表(Project)调整为项目文件列表(Project Files),打开workspace.xml文件。

    图2 workspace.xml文件

  2. 在workspace.xml中的<component name="RunDashboard">标签第一行添加<option name="configurationTypes">标签代码,代码如下:

    1
    2
    3
    4
    5
    6
    7
    8
    <component name="RunDashboard">
    <option name="configurationTypes">
    <set>
    <option value="SpringBootApplicationConfigurationType" />
    </set>
    </option>
    ...
    </component>
  3. 重新打开intellij idea,Run Dashboard会在左下角打开,如图3,可以看到所有的项目,在项目上右键就可以执行,并且执行和关闭的项目都分别列出来了,使用比较方便。

    图3 Run Dashboard

config客户端无法获取配置

config客户端配置好后,通过${}无法获取中心的配置,并报错如下:

1
2
3
4
5
6
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'indexController': Injection of autowired dependencies failed; nested exception is java.lang.IllegalArgumentException: Could not resolve placeholder 'provider.message' in value "${provider.message}"
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:379) ~[spring-beans-5.0.7.RELEASE.jar:5.0.7.RELEASE]
...
Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder 'provider.message' in value "${provider.message}"
at org.springframework.util.PropertyPlaceholderHelper.parseStringValue(PropertyPlaceholderHelper.java:172) ~[spring-core-5.0.7.RELEASE.jar:5.0.7.RELEASE]
...

上述报错表示provider.message无法获取,但是检查了各种配置发现没有任何问题。最后发现原来是config客户端(indexController所在的项目)没有引入config的jar包… 这是个低级错误,但是对于刚开始搭建springcloud项目的新手来说是很容易犯的,因为大多教程中没有这个步骤,所以很容易遇到这个报错。另外还需要注意服务端的配置是spring-cloud-config-client包,不是spring-cloud-config-server包。

下面附上config服务端和客户端的配置,网上大多是git配置,下面就以native为例(毕竟学习时比较实用)。

服务端:

  • pom.xml
    1
    2
    3
    4
    <dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-config-server</artifactId>
    </dependency>
  • bootstrap.yml
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    spring:
    # native要设置spring.profile.action为native
    profiles:
    active: native
    application:
    name: spring-cloud-config
    cloud:
    config:
    server:
    native:
    search-locations: classpath:properties/
  • providerconfig.yml,配置中心的配置文件(用于测试)
    1
    2
    provider:
    message: from config center

客户端:

  • pom.xml
    1
    2
    3
    4
    <dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-config-client</artifactId>
    </dependency>
  • bootstrap.yml
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    spring:
    application:
    name: spring-cloud-provider
    cloud:
    # 配置文件的名称和config服务端的应用名称
    config:
    name: providerconfig
    discovery:
    enabled: true
    serviceId: spring-cloud-config