Spring Cloud Config客户端未从配置服务器加载值
Posted
技术标签:
【中文标题】Spring Cloud Config客户端未从配置服务器加载值【英文标题】:Spring Cloud Config client not loading the value from config server 【发布时间】:2016-11-26 17:24:51 【问题描述】:我在尝试运行 Spring Cloud Config Client 时遇到以下问题:
Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder 'DATABASE_NAME' in string value "$DATABASE_NAME"
at org.springframework.util.PropertyPlaceholderHelper.parseStringValue(PropertyPlaceholderHelper.java:174)
at org.springframework.util.PropertyPlaceholderHelper.replacePlaceholders(PropertyPlaceholderHelper.java:126)
at org.springframework.core.env.AbstractPropertyResolver.doResolvePlaceholders(AbstractPropertyResolver.java:204
我在POM.xml中的依赖如下:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.3.6.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config</artifactId>
<version>1.1.1.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Brixton.SR3</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
bootstrap.yml
spring:
application:
name: my-config-client
cloud:
services:
registrationMethod: route
config:
enabled: true
uri: http://localhost:$config.port:8888
application.yml如下:
# HTTP Server
server:
port: 2222
# Spring properties
spring:
profiles:
active: dev
#Disable HTTP Basic Authentication
security:
basic:
enabled: false
我试图访问该属性的类如下:
@RefreshScope
@Component
public class MyProperty
@Value("$DATABASE_NAME")
private String databaseName;
public String getDatabaseName()
return databaseName;
我的配置服务器运行良好。当我在浏览器http://localhost:8888/configserver/dev 上使用此网址时,它会给出以下结果:
"name":"configserver",
"profiles":[
"dev"
],
"label":"master",
"version":"c991526a93fb776e37e18e138c7485d894d6ea4f",
"propertySources":[
"name":"https://onestash.abc.com/scm/kapmol/microservice-config-repo.git/configserver.properties",
"source":
"DATABASE_NAME":"ABC",
"CONVERT_USERS":"Y",
"LRDS_JNDI_NAME":"jdbc/tds_new"
]
我尝试了所有面临此问题的帖子。但是,它不适合我。可能是,我遗漏了一些观点。如果有人能提供帮助,那就太好了。
谢谢
【问题讨论】:
【参考方案1】:新的 Spring Cloud 模块有一些重大变化阅读更多:here.
由 spring-cloud-commons 提供的 Bootstrap 不再由 默认。如果您的项目需要它,可以通过以下方式重新启用它 属性或新的启动器。
要通过属性集 spring.cloud.bootstrap.enabled=true 或 spring.config.use-legacy-processing=true 重新启用。这些需要设置为 环境变量、java 系统属性或命令行 论据。
另一个选项是包含新的 spring-cloud-starter-bootstrap
通过添加这些依赖项对我有用:
<parent>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-parent</artifactId>
<version>2020.0.0</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>$spring-cloud.version</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
【讨论】:
这引导我找到正确的解决方法,谢谢!顺便说一句:我所需要的只是spring-cloud-starter-bootstrap
依赖项,它拾起 bootstrap.yaml
没有任何问题。
浪费了将近 3 个小时来找出问题所在,是的,春天的人一如既往地改变了一些内部结构,现在我们需要添加 spring-cloud-starter-bootstrap
以使其正常工作。
我自己也遇到过类似的问题,但是我在 linux 命令 strace 下运行了我的 spring 程序,它报告了我的程序访问的每个文件。发现它没有访问 bootstrap.yml 有点惊讶【参考方案2】:
我推荐了this post,由“spencergibb”回答并能够解决问题。我在客户端应用程序的 bootstrap.yml 文件中添加了 "spring.config.name" 并解决了该问题。现在,我的 bootstrap.yml 如下所示:
spring:
application:
name: my-config-client
cloud:
services:
registrationMethod: route
config:
name: configserver
enabled: true
uri: http://localhost:$config.port:8888
【讨论】:
你从哪里得到“$config.port:8888”以上是关于Spring Cloud Config客户端未从配置服务器加载值的主要内容,如果未能解决你的问题,请参考以下文章
Spring Boot 应用程序未从 Spring Cloud Config Server 读取属性值