-
Notifications
You must be signed in to change notification settings - Fork 314
Open
Description
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)
- 在 Nacos 配置中心新建如下配置项:key=nacosExample
- 创建一个监听应用,使用注解监听 key 配置
@NacosValue(value = "${key}", autoRefreshed = true) - 启动应用,获取到监听的 key=nacosExample
- 在 Nacos 控制台删除 key 配置项
- 应用中获取到监听的 key=nacosExample,未感知到配置项删除
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
No labels