现象:
今天线上webservice接收报错500,抓包看到错误原因是Fault occurred while processing.,试了网上的方法都不行。
抓包返回xml:
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope"><soap:Body><soap:Fault><soap:Code><soap:Value>soap:Receiver</soap:Value></soap:Code><soap:Reason><soap:Text xml:lang="en">Fault occurred while processing.</soap:Text></soap:Reason></soap:Fault></soap:Body></soap:Envelope>
实际原因:
webservice接收接口处理抛出了空指针异常
解决:
解决了空指针bug,问题解决
为什么呢?根据报错内容搜源码:
哪里调用了这个方法?好吧找不到。。那看实体类吧
SoapFault
有Throwable!看看父类Fault
再看父类
是RuntimeException!
回到最开始的源码图,现在有了大概猜想,webservice调用getFaultMessage方法获取异常原因时,webservice框架把捕获的异常放入了fault参数里,然后异常message是空,接着config最有可能是false,然后返回了Fault occurred while processing.
带入原因验证猜想,线上空指针,空指针没有message,走入else if,config如果是false或者后面条件是false就会走else 。。。嗯,极可能。
大胆猜测:是不是只要抛出了没有message的异常,就能复现?
实践验证猜想尝试复现:
核心代码:
postman请求结果:
复现成功!
结论:webservice接收接口如果抛出了没有带message的异常就会返回Fault occurred while processing.
顺便一说:网上搜webservice Fault occurred while processing都说是传了null过去导致的,改成传""就可以解决,我觉得这不是本质,本质是服务端处理出异常了,至于传""解决,极可能是服务端没有判断null,直接使用导致了空指针然后抛了异常,而空指针异常是没有message的,导致最后返回Fault occurred while processing.,写个博客防止后面的人被坑吧。