restTemplate

restTemplate大面积出现java.lang.IllegalArgumentException: ‘messageConverters’ must not contain null elements的问题

前文

最近在调用三方接口使用的restTemplate,之前一直没什么问题,近期公司的业务扩大,单量较多,所以就出现了大批量调用三方服务。随之一些隐藏的问题就出现了。

业务描述

公司主要做店铺,订单,仓储等等业务,我们有一个物流服务 主要是请求三方物流商获取运单号和面单信息,在订单服务使用mq发送消息去物流服务,然后用restTemplate去请求三方。restTemplate我们是使用的注入的方式

@Autowired
 private RestTemplate restTemplate;

查看后台日志出现大面积这样的错误:
在这里插入图片描述
根据上面的报错信息不难看出我给restTemplate传过去有null,可是我看我得代码里面 不可能给他的参数有null啊,我都是经过判空处理的(图里面的参数我已经封装好了),上图:
在这里插入图片描述
根据报错的信息去层层查找。

根据报错的位置,我们上源码,红框里面是异常位置451行:
在这里插入图片描述
这里没什么问题,再去看看821行:
在这里插入图片描述
这里也没问题 再看991:
在这里插入图片描述
有个getMessageConverters()方法 我们进去看下:
在这里插入图片描述
在这里插入图片描述
可以看出往list里面已经初始化了变量。所以肯定不会存在null的情况;
接着往下走,再看这几行代码:
在这里插入图片描述
可以看出 我们的异常就是从这里抛出来的。‘messageConverters’ must not contain null elements。
再把这个方法点进去:
Assert.noNullElements(messageConverters, “‘messageConverters’ must not contain null elements”);
在这里插入图片描述
这里可以看出,它是把里面的list进行了遍历,如果某一个节点为null那么就会抛出异常。

到这里问题已经很明显了。就是List<HttpMessageConverter<?>> messageConverters 这里面的某一个元素为null导致的;我们再网往上看这里面初始化的代码:
在这里插入图片描述
这里也不可能为null啊。都是new了对象在里面;再回头看看自己的代码:
在这里插入图片描述
发现在代码里面加入了getMessageConverters()这行代码,可是这行代码加上也不至于让list里面的某一个元素为null啊,它每次调用的时候都会在该list的第一个位置加一个对象放在里面,list容量扩大。乍一看也没什么问题;可是我们要注意有两个关键点:1、ArrayList是线程不安全的 2、大批量的调用;于是我猜想会不会因为并发调用list.add()导致里面的元素更改或者直接add(null) 了 。现在结合这两点我们写一个demo来验证我得猜想:
在这里插入图片描述
猜想被证实;所以面对高并发的问题,还是仔细点的好,不然各种诡异问题让人焦头烂额;

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值