1.概述

在这篇简短的教程中,我们将讨论如何实现和注入ResponseErrorHandler.界面在A.resttemplate.实例 - 优雅地处理远程API返回的HTTP错误。

2.默认错误处理

默认情况下,resttemplate.如果有HTTP错误,将抛出其中一个例外:

  1. HttpClientErrorException- 在http状态4xx的情况下
  2. httpservererrorexception -在HTTP状态5xx的情况下
  3. Unknownhttpstatuscodeexception -如果是未知的HTTP状态

所有这些例外都是扩展restclientResponseException.

显然,添加自定义错误处理的最简单策略是将呼叫包装在一起试着抓堵塞。然后,按照我们认为合适的方式处理捕获的异常。

然而,这种简单的策略不会很好地扩展作为远程API的数量或呼叫的数量增加。如果我们可以为所有远程呼叫实现可重复使用的错误处理程序,它会更有效率。

3.实施A.ResponseErrorHandler.

所以,一个实现的类ResponseErrorHandler.将从响应中读取HTTP状态:

  1. 抛出对我们的应用有意义的例外
  2. 只需忽略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上

通用底部

使用Spring 5和Spring Boot 2开始,通过学习春天课程:

>>查看课程
6.评论
最古老的
最新的
内联反馈
查看所有评论
对这篇文章的评论关闭!