restTemplate自定义状态400码
- 场景,restTemplate在接收自定义状态码和系统错误状态码一致是会报错,接收不到
- 下面拿实名认证二要素接口为例,实名认证不通过返回的是400
- 当实名认证不通过的时候,restTemplate拿不到响应结果,会直接抛异常

分析原因:
- 在RestTemplate源码中可以看到使用了默认的异常处理



- ResponseErrorHandler类内部实现

解决方案:
- 自定义http异常处理类,实现ResponseErrorHandler接口
import org.springframework.http.client.ClientHttpResponse;
import org.springframework.web.client.ResponseErrorHandler;
/**
* 自定义响应异常处理
*
* @author 刘斌-liub2@zzkqdc.com
* @time 2022-09-21
* @rutern
*/
public class CustomerResponseHandler implements ResponseErrorHandler {
@Override
public boolean hasError(ClientHttpResponse response) {
return false;
}
@Override
public void handleError(ClientHttpResponse response) {
}
}
- 设置restTemplate异常处理器为我们刚才自定义的那个
/**
* @author liouwb
*/
@Configuration
public class RestTemplateConfig {
/**
* 异常处理器是默认的
*
* @param builder
* @author liouwb
* @time 2022-09-21
* @rutern org.springframework.web.client.RestTemplate
*/
@Bean
public RestTemplate restTemplate(RestTemplateBuilder builder) {
RestTemplate build = builder.build();
List<HttpMessageConverter<?>> messageConverters = build.getMessageConverters();
return build;
}
/**
* 自定义异常处理(默认不处理,可以接收自定义的400 500等状态)
*
* @param builder
* @author liouwb
* @time 2022-09-21
* @rutern org.springframework.web.client.RestTemplate
*/
@Bean
public RestTemplate customerRestTemplate(RestTemplateBuilder builder) {
RestTemplate build = builder.build();
List<HttpMessageConverter<?>> messageConverters = build.getMessageConverters();
build.setErrorHandler(new CustomerResponseHandler());
return build;
}
}
- 使用自定义异常处理接收400/500状态是,指定注入名称,(不指定的话就是默认的异常处理会报错)
@Autowired(required = false)
@Qualifier("customerRestTemplate")
private RestTemplate restTemplate;
- 指定之后可以接收400状态码
