【问题标题】:Get list of Spring property placeholder and their resolved values获取 Spring 属性占位符列表及其解析值
【发布时间】:2017-01-12 19:11:35
【问题描述】:

我想让正在运行的 Spring (Boot) 应用程序的所有属性占位符及其解析值可用于进程监控。在第一步中,这可能只是将它们写入日志或通过创建类似于 application.pid 文件的“resolved.properties”文件。 应考虑使用属性占位符(隐式/显式)的所有属性。

动机:在操作过程中通常很难知道已解析属性的值。系统属性或命令行参数是“可见的”,但例如代码中隐藏的默认值(如@Value("${timeout:30000}"))很难找到。我希望能够回答“正在运行的应用程序的配置如何?”这个问题。以一种通用的方式,我可以在我的所有 Spring 应用程序中使用。

我知道 Spring Boot Actuator /configprops 端点,但这仅包括 @ConfigurationProperties。我想获取使用占位符的所有属性的列表。

要求似乎不是新的(参见herehere),但我想知道现在是否有合适的(引导)方式。

【问题讨论】:

  • 没有。当前无法列出所有属性源的所有属性值。同样在例如 Spring Cloud Config 的情况下,它不会添加任何内容,因为属性可能会在运行时发生变化。
  • @M.谢谢。我不认为它不会添加任何东西,因为我的配置在运行时不会改变。该功能在 Boot 中以configprops 端点提供,但仅限于@ConfigurationProperties。如果这个限制能够消失,并且 Spring 能够提供对所有占位符及其(当前)值的访问,那就太好了。
  • 没有占位符列表,PropertySources 抽象不提供这样的东西。我并不是说它不会很好,但目前还没有......
  • @M. Deinum 毫不犹豫地提供它作为答案。如果是这样的话 - 我会接受(但我会等待一段时间......);-)

标签: java spring spring-boot


【解决方案1】:

(目前)无法获得Environment 抽象中的所有属性。这是故意的,可以阅读here。这也是无法获得所有用于分辨率的值的原因。

在运行时记录值和解析,以告知在运行时从何处解析了哪个键。但是该日志记录非常冗长,并且每次使用 StringValueResolver 时都会记录下来。

您可能会通过提供您自己的自定义PropertySourcesPlaceholderConfigurer 来获得部分结果,该PropertySourcesPlaceholderConfigurer 维护一组已解析的键/值对。但并非每个分辨率都使用PropertySourcesPlaceholderConfigurer,有些直接使用StringValueResolver 实现绕过PropertySourcesPlaceholderConfigurer

【讨论】:

  • 感谢 - 特别是非常有用的背景信息链接。 @Phil Webb 提供的解决方案似乎涵盖了我正在寻找的信息,但具有默认值声明的属性除外。
  • 问题是你得到了所有的属性。因此,如果在您的application.properties 中定义了一个属性并且作为系统或命令行属性,您将获得这两个值,而不知道实际使用的是哪个值。这同样适用于application-<profile>.properties,来自application.properties 的和被覆盖的都将显示。
  • 非常有用的提示。令人惊讶的是,Spring 在这个用例中变得如此困难。
  • 没有办法知道。占位符在需要时被解析,它可以在传递之间改变。有时在进程的早期,只有系统环境属性可用。稍后在属性文件中,jndi 条目和 servlet 上下文参数可能会更改某些值的分辨率。除此之外,并非每个可能的属性源都是实际可列出的。例如,无法从 JNDI 获取所有条目。
【解决方案2】:

它不能满足您的所有需求(即:所有文件的属性、默认值、应用程序参数等)。 我仍然会为其他读者/未来参考保留答案。

Spring Boot 的 Actuator /env 端点

您可以使用/env 端点。它列出了一堆东西,但也包括 application.properties 的内容(接近尾声):

applicationConfig: [classpath:/application.properties]={myproperty=blah, server.port=8080}

【讨论】:

  • 谢谢。不幸的是,这并没有列出所有位置的属性(所有文件、默认值、应用程序参数等)
  • 哦,好的,我会更新答案,说它并没有涵盖所有内容,但留作将来参考
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-05-22
  • 2014-03-23
  • 2016-10-21
  • 2015-01-16
  • 2021-03-08
  • 2014-07-16
  • 1970-01-01
相关资源
最近更新 更多