%引发的Bug

前几天,因为项目要求,需要用Java程序模拟HTTP请求。接收的服务端是用SpringMVC来写的,是通过参数对象映射将属性自动填充。一开始还是比较顺利的,也顺利地将数据发了出去,可最后检查的时候发现,有一部分的数据并没有完全接受到。
如图:
Debug详情
通过Debug方式得到的详情,发现,其他的属性都是完好的填充起来了,但是只有这个infoCPU的属性还没有自动填充。

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

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

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

Debug一下之后发现:
第二次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,如图:
Debug3
这些终于有数据啦,(^__^) 嘻嘻……


对于%,一般来说,是用在URL中对于字符的一个替换,指定特殊字符,比较常见的就是%20,在现实中是空格的意思。在上面的JSON数据中,因为存在百分数,自然就存在%。正是因为这个的存在才会影响转码之后无法被SpringMVC所接收。
关于网络传输中编码与转码的关系,大家可以参考这篇文章:

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


这是我在项目中遇到的一个小插曲,虽然事后觉得没什么的,但是我觉得,耐心地发现问题,寻找问题,解决问题的思路还是值得深思的,与大家共勉。
有什么想法的都欢迎来留言~(≧▽≦)/~

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值