1.概述
在这篇简短的教程中,我们将讨论如何实现和注入ResponseErrorHandler.界面在A.resttemplate.实例 - 优雅地处理远程API返回的HTTP错误。
2.默认错误处理
默认情况下,resttemplate.如果有HTTP错误,将抛出其中一个例外:
- HttpClientErrorException- 在http状态4xx的情况下
- httpservererrorexception -在HTTP状态5xx的情况下
- Unknownhttpstatuscodeexception -如果是未知的HTTP状态
所有这些例外都是扩展restclientResponseException.。
显然,添加自定义错误处理的最简单策略是将呼叫包装在一起试着抓堵塞。然后,按照我们认为合适的方式处理捕获的异常。
然而,这种简单的策略不会很好地扩展作为远程API的数量或呼叫的数量增加。如果我们可以为所有远程呼叫实现可重复使用的错误处理程序,它会更有效率。
3.实施A.ResponseErrorHandler.
所以,一个实现的类ResponseErrorHandler.将从响应中读取HTTP状态:
- 抛出对我们的应用有意义的例外
- 只需忽略HTTP状态,让响应流继续而不中断
我们需要注射ResponseErrorHandler.实施进入resttemplate.实例。
因此,我们使用resttemplateBuilder.构建模板并更换DefaultResponseErrorHandler在响应流程中。
所以让我们首先实施我们的Resttemplateresponseerrormanler:
@Component公共类RestTemplateSponsErrorHandler实现responseRorHandler {@Override公共布尔·霍尔兰(ClientHttpresponse Httpresponse)抛出IoException {return(httpresponse.getstatuscode()。series()== client_error || httpresponse.getstatuscode()。series()== server_error);@Override public void handererror(clienthttpresponse httpresponse)抛出ioException {if(httpresponse.getstatuscode().series()== httpstatus.series.server_error){// supple server_error} else if(httpresponse.getstatuscode().series()== httpstatus.series.client_error){//句柄client_error if(httpresponse.getstatuscode()== httpstatus.not_found){oppl new notfoundexception();}}}}}
接下来,我们建立resttemplate.实例使用resttemplateBuilder到介绍我们的RestTemplateResponseErrorHandler:
@Service公共类BarconsumerService {Private RestTemplate RestTemplate;@autowired public barconsumerservice(resttemplateBuilder RestTemplateBuilder){resttemplate resttemplate = resttemplateBuilder .ErrorHandler(New RestTemplateresponseRrorHandler()).build();公共条FetchBarbyId(String Barid){Return RestTemplate.getForObject(“/ Bars / 4242”,Bar.class);}}
4.测试我们的实施
最后,让我们通过嘲笑服务器来测试此处理程序并返回a未找到地位:
@runwith(springrunner.class)@contextconfiguration(classes = {notfoundexception.class,bar.class})@restclienttest公共类resttemplatteresponseerrorhanderIntegrationtest {@autowired私有模型mockrestserviceservers服务器;@autowifired private ResttemplateBuilder Builder;@test(预期= notfoundException.class)public voidedremoteapicall_when404error_thenthrownotfound(){assert.assertnotnull(this.builder);assert.assertnotnull(this.server);resttemplate resttemplate = this.builder .errorhandler(new resttemplateresponsererrormanler()).build();this.server .expect(perpectCount.once(),请求(“/ bars / 4242”)).Andexpect(方法(httpmethod.get)).andrespond(withstatus(httpstatus.not_found));栏响应= resttemplate .get for object(“/ bars / 4242”,bar.class);this.server.verify();}}
结论
本文介绍了实现和测试自定义错误处理程序的解决方案resttemplate.将HTTP错误转换为有意义的异常。
一如既往,本文中提供的代码可用在github上。