您的位置:首页 > 其它

%引发的Bug

2016-04-12 14:42 162 查看
前几天,因为项目要求,需要用Java程序模拟HTTP请求。接收的服务端是用SpringMVC来写的,是通过参数对象映射将属性自动填充。一开始还是比较顺利的,也顺利地将数据发了出去,可最后检查的时候发现,有一部分的数据并没有完全接受到。

如图:



通过Debug方式得到的详情,发现,其他的属性都是完好的填充起来了,但是只有这个infoCPU的属性还没有自动填充。

我在Java程序中是传递一个Map,Map中的值都是一些JSON字符串,一开始以为只是Java程序的问题,但是仔细想想,其他数据都是没有问题的,说明问题的所在并不在Java程序这一端。

然后,想想会不会是JSON数据的问题,也就是infoCPU这一个JSON数据的问题。我试了试:

map.put("infoCPU", "infoCPU");


Debug一下之后发现:



数据是有的!!!!!

这下,问题就清楚多了,关键在于这一段的JSON。

这时我想到,会不会有报错的Log。一看发现还真的有,报错的日志是这么写的:

Character decoding failed. Parameter [infoCPU] with value [...] has been ignored. Note that the name and value quoted here may be corrupted due to the failed decoding. Use debug level logging to see the original, non-corrupted values.


这个错误就更加让我明确,问题就是在JSON当中。这个错误是说,字符转码失败,导致被SpringMVC给无视掉了,所以这个属性自然就是null。

于是接着看了看我这段JSON:

{
"infoCPUDetails": [
{
"mhz": 1796,
"vendor": "Intel",
"model": "Core(TM) i5-3337U CPU @ 1.80GHz",
"cacheCount": -1,
"userRadio": "21.9%",
"systemRadio": "0.0%",
"waitRadio": "0.0%",
"errorRadio": "0.0%",
"freeRadio": "78.0%",
"totalUse": "21.9%"
}
]
}

...

其余的JSON数据就不展示了。


一开始还没有看到,看了好久才发现:(不过机智的各位看了我的标题应该也知道问题的所在了吧)

%


问题的关键就在这里,我赶紧将%全部替换掉

.replaceAll("%","");


再次Debug,如图:



这些终于有数据啦,(^__^) 嘻嘻……

对于%,一般来说,是用在URL中对于字符的一个替换,指定特殊字符,比较常见的就是%20,在现实中是空格的意思。在上面的JSON数据中,因为存在百分数,自然就存在%。正是因为这个的存在才会影响转码之后无法被SpringMVC所接收。

关于网络传输中编码与转码的关系,大家可以参考这篇文章:

http://blog.csdn.net/zhh521125/article/details/6627245

这是我在项目中遇到的一个小插曲,虽然事后觉得没什么的,但是我觉得,耐心地发现问题,寻找问题,解决问题的思路还是值得深思的,与大家共勉。

有什么想法的都欢迎来留言~(≧▽≦)/~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: