Skip to content

使用@NacosValue监听,删除配置项后,监听到的配置值未更新,依然保留配置项的历史值 #361

@zmz789

Description

@zmz789

Issue Description

问题版本
nacos-spring-context-1.1.2
问题表现
在使用 @NacosValue 注解进行配置注入时,当 Nacos 配置中心中对应的配置项被删除后,应用中通过 @NacosValue 注入的值并未更新,而是仍然保留该配置项的历史值,导致应用无法感知到配置变化,应用行为在某些场景下不符合预期。

Describe what happened (or what feature you want)

  • 应用启动时成功从 Nacos 获取配置值。
  • 在 Nacos 配置中心中删除该配置项。
  • 应用中通过 @NacosValue 注解注入的值未发生变化,仍保留配置项删除前的值。

Describe what you expected to happen

当 Nacos 配置中心中的配置项被删除时,期望:

  • 如果设置了 autoRefreshed = true,配置值能被更新为字段类型的默认值。
  • 或者能够通过监听机制感知到配置项的删除,至少抛出一个警告或异常,提示配置项已不存在。
  • 可以通过系统属性或环境变量选择是否应用上述机制。

对配置字段默认值的补充说明:

  • 对于基本类型(int, long, boolean 等)返回对应的默认值(0, 0L, false)。
  • 对于非基本类型(包装类型、String、自定义类等)直接返回 null。
  • 用户自定义配置项的默认值时(如 ${key:default_value}),优先返回用户设定的默认值 default_value。

配置项删除后,两种行为逻辑的权衡:

  • 方案一:保留历史值
    • 优点:配置项删除后,配置使用历史值,不会出现 NPE
    • 缺点:应用无法感知配置变化
    • 适用场景:对配置项删除不敏感、@NacosValue 注解无法提供自定义默认值的场景
  • 方案二:更新为默认值
    • 优点:明确告知配置已删除,应用可以据此做降级处理
    • 缺点:需要做好 null 防御
    • 适用场景:用户需要感知配置项已删除、@NacosValue 注解中提供自定义默认值的场景
      综合考虑可以选择折中方案,默认情况下使用方案一,用户可以通过系统属性或环境变量切换为方案二。

How to reproduce it (as minimally and precisely as possible)

  1. 在 Nacos 配置中心新建如下配置项:key=nacosExample
  2. 创建一个监听应用,使用注解监听 key 配置
    @NacosValue(value = "${key}", autoRefreshed = true)
  3. 启动应用,获取到监听的 key=nacosExample
  4. 在 Nacos 控制台删除 key 配置项
  5. 应用中获取到监听的 key=nacosExample,未感知到配置项删除

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions