[spring-projects/spring-boot]当 defaultPropertySource 是组合时,ConfigFileApplicationListener 过滤失败

2024-04-11 267 views
6

在 Boot 2.2.0 之前,如果您使用过spring-cloud-starter并且在您bootstrap.yml设置的spring.config.nameBoot 中,将正确加载属性中指定的属性文件。从 Boot 2.2.0 开始,这不再起作用。

我已追踪到提交 d92c2f70230a6e30ccb5d5b51315062505ff74b6 中添加的这一行的重大更改

我上面描述的情况实际上是这里定义defaultProperties的一个实例。ExtendedDefaultPropertySource

sources属性是一个复合属性,spring.config.name在本例中包含 的值。然而,在ConfigFileApplicationListener.replaceDefaultPropertySourceIfNecessary代码中只是调用.getSource构造新的defaultProperties,因此我们丢失了组合中的属性,因此spring.config.name永远不会检索该属性。

对于重现该问题的示例,您可以查看此测试

回答

8

参见#15445

5

@philwebb 我读了这个问题,但这都是关于配置文件的,这个问题与配置文件无关。

除此之外,我还认为这些更改也破坏了此功能,这确实与配置文件有关。

6

@ryanjbaxter 您引用的提交修复了 Phil 引用的问题。

7

@ryanjbaxter 我刚刚添加了提交 d92c2f70230a6e30ccb5d5b51315062505ff74b6 中引用的问题的链接

6

@wilkinsona @philwebb 抱歉,我误解了你的意思;)

1

@ryanjbaxter 我尝试运行,BootstrapClientApplicationTests但测试通过了,所以我不确定我做错了什么。有什么提示吗?

因为BootstrapConfigurationTests引导程序似乎local.properties正在定义一个spring.profiles.active我们现在正在积极过滤掉的密钥。我不太确定如何解决这个问题并修复#15445。他们似乎彼此不和。引导上下文需要使用名为 的属性源有什么原因吗defaultProperties?如果确实如此,也许我们需要提供一种方法来关闭仅针对该引导上下文的过滤。

5

@philwebb 你是否删除了@Ignore测试中的BootstrapClientApplicationTests

引导上下文需要使用名为 defaultProperties 的属性源是否有任何原因?

@spencergibb @dsyer 你知道吗?我有点不确定。

7

我也不确定。

0

@Ignore在测试中

哎哟! ?‍♂

8

事实上,即使@Ignore删除它似乎也能工作

7

奇怪的是不确定,它在我的机器上失败了

1

我能够重现这个。正如 @ryanjbaxter 提到的,这是因为我们defaultProperties.getSource() 在这里使用. Spring Cloud使用ExtendedDefaultPropertySource的将属性源包装在 a 内,CompositePropertySource并且defaultProperties.getSource()只返回一个空映射。我们可以更改过滤逻辑,使其仅适用于 Spring Boot 的默认属性源,或者仅适用于默认属性源是MapPropertySource.

2

@ryanjbaxter 我已经实现了 @mbhave 建议的修复,本问题中引用的两个 Spring Cloud 测试现在都适用于我本地。

0

FWIW,当我在本地使用./mvnw -U clean verify.

8

看来我错误地认为同一个修复程序能够修复这两个测试。我在这里分享@philwebb 所说的话:

我不太确定如何修复这个问题并修复 15445。

我认为过滤仅适用于启动的解决方案defaultProperties也不起作用。包装ExtendedDefaultPropertySourceBoot's defaultProperties,因此需要应用它才能保持一致。

3

我发誓它在我的 IDE 中有效:/

我已打开#17141 来查看失败的测试。感觉像是一个不同的问题,并且复合属性源问题已得到解决,因此让我们仅针对该问题保留此问题。