nacos-group / nacos-spring-project

Nacos ECO Project for Spring Framework
https://nacos.io/
Apache License 2.0
756 stars 311 forks source link

json默认值解析失败修复 #262

Closed zxn-git closed 3 years ago

zxn-git commented 3 years ago

Please do not create a Pull Request without creating an issue first.

What is the purpose of the change

修复默认值json解析失败bug:https://github.com/alibaba/nacos/issues/6003

Brief changelog

  1. 示例:${a:{"0":"1"}}
  2. 代码修改:将从字符串 ${ 开始匹配第一个 } 改成从字符串最后面匹配第一个}

Verifying this change

  1. 示例:${a:{"0":"1"}}
  2. 修复前后输出:${a}} ${a}

Follow this checklist to help us incorporate your contribution quickly and easily:

zxn-git commented 3 years ago

缺省场景很多的,我们线上好多都配置的json。所有的配置都要有默认值,如果nocos没有配置线上依然可以运行

------------------ 原始邮件 ------------------ 发件人: @.>; 发送时间: 2021年6月10日(星期四) 晚上7:28 收件人: @.>; 抄送: @.>; @.>; 主题: Re: [nacos-group/nacos-spring-project] json默认值解析失败修复 (#262)

@horizonzy commented on this pull request.

In nacos-spring-context/src/main/java/com/alibaba/nacos/spring/context/annotation/config/NacosValueAnnotationBeanPostProcessor.java: > @@ -375,7 +375,7 @@ private void setField(final NacosValueTarget nacosValueTarget, private String resolveExpr(String nacosValueExpr) { int replaceHolderBegin = nacosValueExpr.indexOf(PLACEHOLDER_PREFIX) + PLACEHOLDER_PREFIX.length(); - int replaceHolderEnd = nacosValueExpr.indexOf(PLACEHOLDER_SUFFIX, replaceHolderBegin); + int replaceHolderEnd = nacosValueExpr.lastIndexOf(PLACEHOLDER_SUFFIX);
Hi, 这种修复应该是不行的。可以本地跑NacosPropertySourceTest这个测试类来进行测试。这个问题不好解决,在缺省值种使用json是什么场景呢。

— You are receiving this because you authored the thread. Reply to this email directly, view it on GitHub, or unsubscribe.

horizonzy commented 3 years ago

缺省场景很多的,我们线上好多都配置的json。所有的配置都要有默认值,如果nocos没有配置线上依然可以运行

嗯,现在的问题就是去找${对应的}位置出错了,我的建议是通过{}去定位}的位置。

zxn-git commented 3 years ago

嗯,现在要明确你们对下面这种场景的输出预期是什么我理解不管 ${a:这里配置了什么} 最后一个}才是结尾标志。 类似${a:}}} 这种是放弃后面两个} ,还是 }} 这两个作为默认值

 发送 

------------------ 原始邮件 ------------------ 发件人: @.>; 发送时间: 2021年6月11日(星期五) 凌晨0:01 收件人: @.>; 抄送: @.>; @.>; 主题: Re: [nacos-group/nacos-spring-project] json默认值解析失败修复 (#262)

@horizonzy commented on this pull request.

In nacos-spring-context/src/main/java/com/alibaba/nacos/spring/context/annotation/config/NacosValueAnnotationBeanPostProcessor.java: > @@ -375,7 +375,7 @@ private void setField(final NacosValueTarget nacosValueTarget, private String resolveExpr(String nacosValueExpr) { int replaceHolderBegin = nacosValueExpr.indexOf(PLACEHOLDER_PREFIX) + PLACEHOLDER_PREFIX.length(); - int replaceHolderEnd = nacosValueExpr.indexOf(PLACEHOLDER_SUFFIX, replaceHolderBegin); + int replaceHolderEnd = nacosValueExpr.lastIndexOf(PLACEHOLDER_SUFFIX);
提供一个思路。通过{和}符号的出栈入栈来定位}的下标

— You are receiving this because you authored the thread. Reply to this email directly, view it on GitHub, or unsubscribe.

horizonzy commented 3 years ago

这个方法resolve的目的就是获取排除缺省值的原始信息.比如以下几种场景:

我的建议是: 通过{的入栈和}的出栈去定位${中出现{所匹配的}的位置。

horizonzy commented 3 years ago

另外,在NacosPropertySourceTest的App类中增加一个String字段缺省值存在json这种格式的。把测试补上。

horizonzy commented 3 years ago

哈喽,有进展吗。

zxn-git commented 3 years ago

最近比较忙,不好意思哈,方便的话可以找其他人修复下

------------------ 原始邮件 ------------------ 发件人: "nacos-group/nacos-spring-project" @.>; 发送时间: 2021年6月16日(星期三) 下午5:20 @.>; @.**@.>; 主题: Re: [nacos-group/nacos-spring-project] json默认值解析失败修复 (#262)

哈喽,有进展吗。

— You are receiving this because you authored the thread. Reply to this email directly, view it on GitHub, or unsubscribe.

horizonzy commented 3 years ago

最近比较忙,不好意思哈,方便的话可以找其他人修复下

那暂时先把你这个合并了,剩下的我再提一个补上,感谢贡献。

zxn-git commented 3 years ago

嗯嗯,非常抱歉,大佬辛苦

------------------ 原始邮件 ------------------ 发件人: "nacos-group/nacos-spring-project" @.>; 发送时间: 2021年6月16日(星期三) 晚上8:52 @.>; @.**@.>; 主题: Re: [nacos-group/nacos-spring-project] json默认值解析失败修复 (#262)

最近比较忙,不好意思哈,方便的话可以找其他人修复下

那暂时先把你这个合并了,剩下的我再提一个补上。

— You are receiving this because you authored the thread. Reply to this email directly, view it on GitHub, or unsubscribe.