最近在测试接口时发现程序里返回401错误,但是返回值为null,之后用postman测试时,发现竟然可以正常得到返回体,怎么都想不明白这是怎么回事
开始怀疑postman出了问题,于是又换了jmeter,也能得到返回值,然后就开始排查程序,并查找资料,最后发现是 RestTemplate 的问题。对于非 200 状态码, 会直接抛出异常,会中断接下来的操作,返回null,因此401得不到返回值,经过查找资料和测试发现,对于非200错误,比如 4xx/5xx 异常信息捕获,可以通过以下两步解决
1、修改RestTemplateConfig
使用HttpComponentsClientHttpRequestFactory替代默认的simpleClientHttpRequestFactory
@Bean
public RestTemplate restTemplate( ) {
HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory();
factory.setReadTimeout(150000);//单位为ms
factory.setConnectTimeout(50000);//单位为ms
return new RestTemplate(factory);
}
2、RestTemplate自定义异常处理:
在发送请求前(restTemplate.exchange之前)添加:
restTemplate.setErrorHandler(new DefaultResponseErrorHandler(){
@Override
public void handleError(ClientHttpResponse response) throws IOException {
if(response.getRawStatusCode() !=401) {//根据错误类型需要修改
super.handleError(response);
}
}
});
实测经过以上两个步骤,就可以正常得到报错信息了。