Java 获取Spring属性占位符及其解析值的列表

Java 获取Spring属性占位符及其解析值的列表,java,spring,spring-boot,Java,Spring,Spring Boot,我想让正在运行的Spring(Boot)应用程序的所有属性占位符及其解析值都可用于进程监视。在第一步中,可以将它们写入日志,或者创建类似于application.pid文件的“resolved.properties”文件。 应考虑使用属性占位符(隐式/显式)的所有属性 动机:在操作过程中,通常很难知道解析属性的值。系统属性或命令行参数是“可见的”,但例如代码中隐藏的默认值(如@Value(${timeout:30000}”))很难找到。我希望能够以一种我可以在所有spring应用程序中使用的通用

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

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

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

这个要求似乎并不新鲜(见或),但我想知道现在是否有一个合适的(bootiful)方法

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

弹簧靴的执行器
/env
端点

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

(目前)无法获得
环境中的所有属性。这是故意的,可以理解。这也是为什么不可能获得用于分辨率的所有值的原因

这些值和分辨率在运行时被记录下来,告知在运行时从何处解析了哪个键。但这种日志记录非常详细,每次使用
StringValueResolver
时都会记录


您可以通过提供自己定制的
propertySourcesplacePlaceholderConfigurer
来获得部分结果,该配置器维护已解析的键/值对的集合。但并非所有解析都使用
属性资源占位符配置器
有些解析直接使用
StringValueResolver
实现,而不使用
属性资源占位符配置器

。目前无法列出所有属性源上的所有属性值。例如,SpringCloud配置不会添加任何内容,因为属性可能在运行时发生更改。@M.Deinum谢谢。我不认为它不会添加任何内容,因为我的配置在运行时不会更改。该功能在引导时随
configprops
端点一起提供,但仅限于
@ConfigurationProperties
。如果这个限制消失,如果Spring能够提供对所有占位符及其(当前)值的访问,那就太好了。没有占位符列表,
PropertySources
抽象不提供这样的东西。我并不是说这不会很好,但目前还没有…@m.Deinum毫不犹豫地给出答案。如果是这样的话-我会接受它(但我会等一会儿…-)谢谢不幸的是,这并没有列出所有位置的属性(所有文件、默认值、应用程序参数等)。哦,好的,我会更新答案,说它没有涵盖所有内容,但留给以后参考谢谢-特别是非常有用的背景信息链接。@Phil Webb提供的解决方案似乎涵盖了我要查找的信息,但带有默认值声明的属性除外。问题是您获得了所有属性。因此,如果在
应用程序.properties
中定义了一个属性,并将其作为系统或命令行属性,您将获得这两个值,而不知道实际使用的是哪一个。这同样适用于
application-.properties
,将显示
application.properties
中的属性和覆盖的属性。非常有用的提示。令人惊讶的是,Spring使这个用例变得如此困难。没有办法知道它。占位符会在需要时解析,并且可以在传递期间更改。有时在过程的早期,只有system en环境属性可用。稍后在属性文件上,jndi条目和servlet上下文参数可能会更改某些值的解析。其次,并非所有可能的属性源都是可实际列出的。例如,无法从JNDI获取所有条目。
applicationConfig: [classpath:/application.properties]={myproperty=blah, server.port=8080}