Spring Cloud Refresh 事件无法识别已删除的属性?

Mis*_*yed 6 spring-boot spring-cloud spring-cloud-config

背景:

我有一个使用 Spring Cloud 运行的 Spring Boot 1.4 应用程序。我的应用程序使用本机配置文件从外部 config.properties 文件中提取设置。配置服务器嵌入在同一应用程序中。

在 config.properties 文件中,我添加了以下设置:

app.setting=helloworld
Run Code Online (Sandbox Code Playgroud)

什么有效:

当我更改属性并发送 REFRESH 事件时,标记的相关 bean 会重新加载,并且更改会被正确识别。

什么不起作用:

如果我实际上从 config.properties 中删除该属性(例如通过将其注释掉),则 REFRESH 事件不会执行任何实际刷新应用程序的操作。Spring Cloud 似乎没有认识到该属性已被删除的事实,并且当数据绑定器继续更新世界的状态时,它错过了该属性已被删除的事实,并且链接到它的相应 bean 也必须被刷新及其字段设置为空白/空等。

看起来数据绑定器只查看配置中当前可用的内容,并且不记录was 和 is 的记录。

在 bean 配置状态中实际禁用该设置的唯一方法不是删除它,而是实际将其设置为空白值(这是一个新值,因为该设置只是一个字符串)。请注意,映射到此属性的 Java bean 中的字段除了 null 之外没有默认值,并且该值未在其他任何地方定义(如嵌入的 application.properties 文件等)

  1. 我可能会缺少什么?
  2. 这是一个功能吗?漏洞?

谢谢你的时间。

lmi*_*ika 3

不确定这是否适用于您,但我对@ConfigurationProperties使用以下注解和注册的bean 也有类似的问题@EnableAutoConfiguration

@ConfigurationProperties(prefix="example")
@RefreshScope
public class MyConfig {
    private List<String> values;
}

@EnableAutoConfiguration(MyConfig.class)
public class ApplicationConfiguration {
}
Run Code Online (Sandbox Code Playgroud)

我遇到的问题是当您有如下 YAML 配置时:

example:
  - Some
  - Values
  - Here
Run Code Online (Sandbox Code Playgroud)

从列表中删除项目并不会MyConfig.values在刷新上下文时将其删除。

其原因是注册MyConfigusing@EnableAutoConfiguration不允许您更改 bean 的范围,这意味着刷新上下文时不会重新创建 bean。请参阅Github 问题

我的修复

我删除MyConfig@EnableAutoConfiguration明确添加了一个@Component注释:

@Component
@ConfigurationProperties(prefix="example")
@RefreshScope
public class MyConfig {
    private List<String> values;
}

@EnableAutoConfiguration
public class ApplicationConfiguration {
}
Run Code Online (Sandbox Code Playgroud)

此后,MyConfig刷新上下文时会反映出从 YAML 列表中删除项目的情况。