【问题标题】:Spring config server refresh properties from local config fileSpring config server 从本地配置文件刷新属性
【发布时间】:2018-12-08 19:48:20
【问题描述】:

在我的 Spring Cloud 应用程序中,我想让用户更改一些默认设置。我将默认属性保留在 jar 中的 application.yml 中,并使用

启动我的应用程序
-Dspring.config.additional-location=/some_location/properties_override.yml

当用户更改 properties_override.yml 时,我想重新加载配置而不重新启动应用程序。 Spring 配置服务器似乎是它的理想机制,但我无法弄清楚它是否可以与位于文件系统本地的属性一起使用。当我查看 spring.cloud.config 时,它似乎只支持 git、jdbc 和 svn 服务器。这些机制都不是我的选择我想知道你是否可以使用 Spring Cloud Config 从文件系统上的本地文件重新加载配置?

使用“native”配置文件似乎是正确的方法,但它产生了另一个问题:我需要 cloud.config.server.native.searchLocations 中的两个条目:一个用于类路径上的 application.yml(在模块的 src \main\resources\config 文件夹)和文件路径上的第二个。 将 searchLocations 设置为:

 searchLocations: classpath:/config,file:/some_location/properties_override.yml 

application.yml 中的属性没有被拾取。

如果我的 application.yml 我有条目

custom:
  property: foo

有一个 Spring bean 的属性标记为

@Value("${custom.property"})

如果 application.yml 中没有 searchLocations,则正在解析该属性。使用 searchLocations 我得到一个例外:

 java.lang.IllegalArgumentException: Could not resolve placeholder 'custom.property' in value "${custom.property}"
at org.springframework.util.PropertyPlaceholderHelper.parseStringValue(PropertyPlaceholderHelper.java:172) ~[spring-core-5.0.4.RELEASE.jar:5.0.4.RELEASE]
at org.springframework.util.PropertyPlaceholderHelper.replacePlaceholders(PropertyPlaceholderHelper.java:124) ~[spring-core-5.0.4.RELEASE.jar:5.0.4.RELEASE]
at org.springframework.core.env.AbstractPropertyResolver.doResolvePlaceholders(AbstractPropertyResolver.java:237) ~[spring-core-5.0.4.RELEASE.jar:5.0.4.RELEASE]
at org.springframework.core.env.AbstractPropertyResolver.resolveRequiredPlaceholders(AbstractPropertyResolver.java:211) ~[spring-core-5.0.4.RELEASE.jar:5.0.4.RELEASE]
at org.springframework.context.support.PropertySourcesPlaceholderConfigurer.lambda$processProperties$0(PropertySourcesPlaceholderConfigurer.java:175) ~[spring-context-5.0.4.RELEASE.jar:5.0.4.RELEASE]

【问题讨论】:

    标签: spring-cloud-config


    【解决方案1】:

    设置基于文件系统的存储库是最简单的方法 做到这一点。 使用spring.profiles.active=native 这应该可以。 这是一个使用 yml 文件的示例:

    server:
      port: 8888
    spring:
      profiles:
        active: native
      cloud:
        config:
          server:
            native:
              searchLocations: file:///Users/gurinder/projects/application-name/configserver/src/main/resources/config/yourservice
    

    同时查看此链接stackoverflow-question。 如果您想用更新的属性刷新您的属性。首先,您需要在 Spring Boot Main 应用程序类或包含您需要刷新的那些属性的类上使用注释 @RefreshScope。其次,你调用这个 URL :http://<yourserver>:8080/refresh 这将刷新值并用新的值替换它们。

    【讨论】:

    • 我试过了,似乎我需要指定两个属性文件:类路径上的 application.yml 和文件路径上的 properties_override.yml。我的 application.yml 有条目:custom: property:foo 我的 searchLocation 值为:classpath:/config,file:/some_location/properties_override.yml 我有一个带有属性的 Spring bean:@Value("${custom.property}" ) 私有字符串道具;当我启动我的应用程序时,出现异常:无法解析值“${custom.property}”中的占位符“custom.propertyt”
    • 是的,您需要指定这两个文件。例如,您的 application.yml 将位于“application-name/src/main/resources”中,然后如上所述的“searchLocations:”将具有您的 properties_override.yml 的路径。我建议您将 application.yml 放在“application-name/src/main/resources”中,然后在其中创建另一个名为 config 的目录并将您的 properties_override 放入其中。 application.yml => "application-name/src/main/resources" properties_override.yml => "application-name/src/main/resources/config"
    猜你喜欢
    • 2019-03-20
    • 2019-01-24
    • 1970-01-01
    • 2019-08-11
    • 2017-01-08
    • 1970-01-01
    • 1970-01-01
    • 2021-03-15
    • 2019-06-30
    相关资源
    最近更新 更多