什么?RestTemplate和JSON意外的相爱相杀?这个bug你知道吗?

364 阅读2分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

BUG再现:

我有一个RestTemplate

image.png

我有一个JSON数据

image.png

(RestTemplate传输JSON数据)

嗯!出bug了!

某一天,我的小伙伴快乐的写着代码,由于涉及很多资源的操作,所以他想到了restful风格,使用了RestTemplate来进行服务调用。

他代码敲的飞快,一切看起来都是那么顺利,甚至让他产生了今晚不用加班可以回家打游戏的错觉。

这时,他的需求要传输一个对象,他顺利成长的想到了用JSON格式进行传输,于是他非常自然地将对象转换为JSON字符串拼在了url上,脑海中已经浮现了测试成功,快乐回家的景象。

// 伪代码示例 @Resource private RestTemplate restTemplate String url=localhost:8080/boxMan/{"json":"我是一个快乐的小JSON"}; restTemplate.getForObject(url,String.class)

结果程序很快就报错了:

java.lang.IllegalArgumentException: Not enough variable values available to expand 'Object'

哦吼,明显是对象并没有被RestTemplate识别呢,可是小伙伴挠了挠头,这RestTemplate用的好好的,JSON也用的好好的,两件好用的事情合在一起,本应该是双倍的快乐,怎么现在报错了呢?

DEBUG环节:

这个用法看似没什么问题,但其实BUG的原理其实是JSON格式的大括号{和RestTemplate的占位符冲突了,在没有特别声明占位符的情况下,RestTemplate将json的大括号{当做了占位符,导致了JSON格式对象被破坏了。所以我们需要在定义url的时候提供一个占位符来解决这个问题。 @Resource private RestTemplate restTemplate String json = "{"json":"我是一个快乐的小JSON"}"; String url = localhost:8080/boxMan/{json}; restTemplate.getForObject(url,String.class,json)

以这样的格式来进行调用,就可以解决这个问题啦。

总结:

使用RestTemplate时,应该注意占位符和参数有没有冲突,在冲突的情况下改换格式,解决问题。