最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

解決RestTemplate 請求接收自定義400+ 或500+錯誤

 更新時間:2021年08月19日 10:33:09   作者:liulisha丶  
這篇文章主要介紹了解決RestTemplate 請求接收自定義400+ 或500+錯誤,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

RestTemplate 請求接收自定義400+ 或500+錯誤

場景

當(dāng)服務(wù)端自定義400錯誤返回體時,使用restTemplate 請求接收不到消息體。而我正想根據(jù)不同的錯誤信息做不同的操作。

原因

restTemplate 內(nèi)置了自己的處理異常的方法ResponseErrorHandler去處理異常

protected void handleResponse(URI url, HttpMethod method, ClientHttpResponse response) throws IOException {
  ResponseErrorHandler errorHandler = getErrorHandler();
  boolean hasError = errorHandler.hasError(response);
  if (logger.isDebugEnabled()) {
   try {
    logger.debug(method.name() + " request for \"" + url + "\" resulted in " +
      response.getRawStatusCode() + " (" + response.getStatusText() + ")" +
      (hasError ? "; invoking error handler" : ""));
   }
   catch (IOException ex) {
    // ignore
   }
  }
  if (hasError) {
   errorHandler.handleError(response);
  }
 }

當(dāng)接收到CLIENT_ERROR 或 SERVER_ERROR 時,直接拋異常

@Override
 public void handleError(ClientHttpResponse response) throws IOException {
  HttpStatus statusCode = getHttpStatusCode(response);
  switch (statusCode.series()) {
   case CLIENT_ERROR:
    throw new HttpClientErrorException(statusCode, response.getStatusText(),
      response.getHeaders(), getResponseBody(response), getCharset(response));
   case SERVER_ERROR:
    throw new HttpServerErrorException(statusCode, response.getStatusText(),
      response.getHeaders(), getResponseBody(response), getCharset(response));
   default:
    throw new RestClientException("Unknown status code [" + statusCode + "]");
  }
 }

解決辦法

自定義異常處理器,對響應(yīng)的錯誤信息不進(jìn)行處理

public class FacePlusThrowErrorHandler implements ResponseErrorHandler {
    @Override
    public boolean hasError(ClientHttpResponse response) throws IOException {
        return false;
    }
    @Override
    public void handleError(ClientHttpResponse response) throws IOException {
    }
}

之后在bean 注入時,設(shè)置restTemplate 默認(rèn)異常處理器為我們自定義的

 @Bean
    public RestTemplate facePlusRestTemplate() {
        HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory();
        requestFactory.setConnectTimeout(300000);
        requestFactory.setReadTimeout(300000);
        RestTemplate restTemplate = new RestTemplate(requestFactory);
        restTemplate.getMessageConverters().set(1, new StringHttpMessageConverter(StandardCharsets.UTF_8));
        restTemplate.getMessageConverters().add(new FormHttpMessageConverter());
        restTemplate.setErrorHandler(new FacePlusThrowErrorHandler());
        return restTemplate;
    }

然后當(dāng)我們使用restTemplate 時,設(shè)置restTemplate bean 名為注入時起的名字

@Resource(name = "facePlusRestTemplate")
private RestTemplate restTemplate;

最后從返回的ResponseEntity 中取body 屬性,就可以取得服務(wù)端返回的消息體了

自定義RestTemplate的ResponseErrorHandler

Spring框架中的RestTemplate處理ClientHttpResponse的方式

直接看RestTemplate的源碼

在這里插入圖片描述 在這里插入圖片描述

這里主要判斷了是ClientError還是ServerError,即4xx或者是5xx。

如若是這兩類狀態(tài)碼,會執(zhí)行handleError()拋出異常

在這里插入圖片描述

并不想讓它拋異常

在一些業(yè)務(wù)場景下,或許我們并不想讓它拋異常(即便我們可以捕獲異常,額外做處理),那么就需要我們ResponseErrorHandler,并且重新定義一個RestTemplate對象使用該ErrorHandler。(簡單實(shí)現(xiàn)如下)

@Configuration
public class CustomResponseErrorHandler implements ResponseErrorHandler {
    @Override
    public boolean hasError(ClientHttpResponse clientHttpResponse) throws IOException {
        return false;
    }
    @Override
    public void handleError(ClientHttpResponse clientHttpResponse) throws IOException {
    }
    @Bean("customRestTemplate")
    public RestTemplate customRestTemplate() {
        HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory();
        requestFactory.setConnectTimeout(300000);
        requestFactory.setReadTimeout(300000);
        RestTemplate restTemplate = new RestTemplate(requestFactory);
        restTemplate.getMessageConverters().set(1, new StringHttpMessageConverter(StandardCharsets.UTF_8));
        restTemplate.getMessageConverters().add(new FormHttpMessageConverter());
        restTemplate.setErrorHandler(new CustomResponseErrorHandler());
        return restTemplate;
    }
}

還需要加入一個maven依賴(具體原因查看maven依賴圖)

<!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpclient -->
<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpclient</artifactId>
    <version>4.5.5</version>
</dependency>

在spring 中以IOC方式注入

@Resource(name = "customRestTemplate")
private RestTemplate restTemplate;

到這里已經(jīng)可以正常使用。

無法使用IOC注入的場景下

還是參照CustomResponseErrorHandler中的customRestTemplate()去new對象吧……

以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • SpringBoot2整合Redis緩存三步驟代碼詳解

    SpringBoot2整合Redis緩存三步驟代碼詳解

    這篇文章主要介紹了SpringBoot2整合Redis緩存三步驟,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-03-03
  • 使用java技術(shù)抓取網(wǎng)站上彩票雙色球信息詳解

    使用java技術(shù)抓取網(wǎng)站上彩票雙色球信息詳解

    這篇文章主要介紹了使用java技術(shù)抓取網(wǎng)站上彩票雙色球信息詳解,web結(jié)果由html+js+css組成,html結(jié)構(gòu)都有一定的規(guī)范,數(shù)據(jù)動態(tài)交互可以通過js實(shí)現(xiàn)。,需要的朋友可以參考下
    2019-06-06
  • 關(guān)于springboot配置文件密文解密方式

    關(guān)于springboot配置文件密文解密方式

    這篇文章主要介紹了關(guān)于springboot配置文件密文解密方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • 基于springboot+vue實(shí)現(xiàn)垃圾分類管理系統(tǒng)

    基于springboot+vue實(shí)現(xiàn)垃圾分類管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了基于springboot+vue實(shí)現(xiàn)垃圾分類管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • Springboot詳細(xì)講解RocketMQ實(shí)現(xiàn)順序消息的發(fā)送與消費(fèi)流程

    Springboot詳細(xì)講解RocketMQ實(shí)現(xiàn)順序消息的發(fā)送與消費(fèi)流程

    RocketMQ作為一款純java、分布式、隊(duì)列模型的開源消息中間件,支持事務(wù)消息、順序消息、批量消息、定時消息、消息回溯等,本篇我們了解如何實(shí)現(xiàn)順序消息的發(fā)送與消費(fèi)
    2022-06-06
  • Java線程休眠的5種方法

    Java線程休眠的5種方法

    這篇文章主要介紹了Java線程休眠的5種方法,分別是Thread.sleep、TimeUnit、wait、Condition、LockSupport,下面文章將對這五種方法進(jìn)行詳細(xì)講解,需要的小伙伴可以參考一下
    2022-05-05
  • java之路徑分隔符介紹

    java之路徑分隔符介紹

    考慮到程序的可移植性,創(chuàng)建文件時建議大家選用"/",因?yàn)榻?jīng)過測試用java創(chuàng)建文件時在windows平臺下用“/”也是可以的,java貌似在后臺作過處理了。
    2013-03-03
  • SpringShell命令行之交互式Shell應(yīng)用開發(fā)方式

    SpringShell命令行之交互式Shell應(yīng)用開發(fā)方式

    本文將深入探討Spring Shell的核心特性、實(shí)現(xiàn)方式及應(yīng)用場景,幫助開發(fā)者掌握這一強(qiáng)大工具,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-04-04
  • SpringBoot加載應(yīng)用事件監(jiān)聽器代碼實(shí)例

    SpringBoot加載應(yīng)用事件監(jiān)聽器代碼實(shí)例

    這篇文章主要介紹了SpringBoot加載應(yīng)用事件監(jiān)聽器代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-06-06
  • Spring JDK動態(tài)代理實(shí)現(xiàn)過程詳解

    Spring JDK動態(tài)代理實(shí)現(xiàn)過程詳解

    這篇文章主要介紹了Spring JDK動態(tài)代理實(shí)現(xiàn)過程詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-02-02

最新評論

松滋市| 肥东县| 静安区| 枣阳市| 湖北省| 锦屏县| 庄浪县| 舒兰市| 东丰县| 海宁市| 乐东| 镇坪县| 宽城| 高平市| 隆林| 冕宁县| 株洲县| 庄河市| 吐鲁番市| 同仁县| 温宿县| 隆林| 廉江市| 千阳县| 尖扎县| 衡阳市| 邯郸市| 康定县| 三门县| 武定县| 绩溪县| 临泽县| 鄢陵县| 淳安县| 翁源县| 尼勒克县| 高要市| 老河口市| 襄汾县| 尉氏县| 西盟|