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
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions