欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

解決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)的錯誤信息不進行處理

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。(簡單實現(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)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java中SSM框架實現(xiàn)增刪改查功能代碼詳解

    Java中SSM框架實現(xiàn)增刪改查功能代碼詳解

    這篇文章主要介紹了Java中SSM框架實現(xiàn)增刪改查功能代碼詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • Spring?Boot日志介紹和配置

    Spring?Boot日志介紹和配置

    在程序中,日志對象通過LoggerFactory獲取,日志框架如SLF4J提供統(tǒng)一API,便于管理和維護,日志級別分為FATAL、ERROR、WARN、INFO、DEBUG、TRACE,通過配置可細化日志輸出,日志還可持久化存儲和格式化,使用lombok可簡化日志代碼的編寫
    2024-11-11
  • Nacos單機版安裝啟動的全流程

    Nacos單機版安裝啟動的全流程

    這篇文章主要介紹了Nacos單機版安裝啟動的全流程,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • 基于Restful接口調(diào)用方法總結(jié)(超詳細)

    基于Restful接口調(diào)用方法總結(jié)(超詳細)

    下面小編就為大家?guī)硪黄赗estful接口調(diào)用方法總結(jié)(超詳細)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-08-08
  • Java的Character類詳解

    Java的Character類詳解

    在實際開發(fā)過程中,我們經(jīng)常會遇到需要使用對象,而不是內(nèi)置數(shù)據(jù)類型的情況。為了解決這個問題,Java語言為內(nèi)置數(shù)據(jù)類型char提供了包裝類Character類。本文詳細介紹了Java的Character類,感興趣的同學(xué)可以參考閱讀
    2023-04-04
  • elasticsearch數(shù)據(jù)信息索引操作action?support示例分析

    elasticsearch數(shù)據(jù)信息索引操作action?support示例分析

    這篇文章主要為大家介紹了elasticsearch數(shù)據(jù)信息索引操作action?support示例分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-04-04
  • Java中的常用輸入輸出語句的操作代碼

    Java中的常用輸入輸出語句的操作代碼

    這篇文章主要介紹了Java中的常用輸入輸出語句的操作代碼,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-02-02
  • 詳解Java分布式緩存系統(tǒng)中必須解決的四大問題

    詳解Java分布式緩存系統(tǒng)中必須解決的四大問題

    分布式緩存系統(tǒng)是三高架構(gòu)中不可或缺的部分,極大地提高了整個項目的并發(fā)量、響應(yīng)速度,但它也帶來了新的需要解決的問題,分別是: 緩存穿透、緩存擊穿、緩存雪崩和緩存一致性問題。本文將詳細講解一下這四大問題,需要的可以參考一下
    2022-04-04
  • IDEA類與方法注釋模板設(shè)置圖文教程(非常詳細)

    IDEA類與方法注釋模板設(shè)置圖文教程(非常詳細)

    IDEA自帶的注釋模板不是太好用,我本人到網(wǎng)上搜集了很多資料系統(tǒng)的整理了一下制作了一份比較完整的模板來分享給大家,下面這篇文章主要給大家介紹了關(guān)于IDEA類與方法注釋模板設(shè)置的相關(guān)資料,需要的朋友可以參考下
    2022-09-09
  • SpringBoot Pom文件依賴及Starter啟動器詳細介紹

    SpringBoot Pom文件依賴及Starter啟動器詳細介紹

    這篇文章主要介紹了SpringBoot Pom文件的依賴與starter啟動器的作用,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-09-09

最新評論