【问题标题】:Spring Cloud Config client not loading the value from config serverSpring Cloud Config客户端未从配置服务器加载值
【发布时间】: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"
         }
      }
   ]
}

我尝试了所有面临此问题的帖子。但是,它不适合我。可能是,我遗漏了一些观点。如果有人能提供帮助,那就太好了。

谢谢

【问题讨论】:

    标签: maven spring-boot spring-cloud-config


    【解决方案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}”
    猜你喜欢
    • 2015-07-13
    • 2020-07-23
    • 2020-07-10
    • 2019-10-15
    • 2021-12-10
    • 2021-02-26
    • 1970-01-01
    • 1970-01-01
    • 2021-05-08
    相关资源
    最近更新 更多