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

SpringBoot處理全局統(tǒng)一異常的實現

 更新時間:2020年09月15日 10:40:15   作者:冬眠的山谷  
這篇文章主要介紹了SpringBoot處理全局統(tǒng)一異常的實現,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

在后端發(fā)生異常或者是請求出錯時,前端通常顯示如下

Whitelabel Error Page
This application has no explicit mapping for /error, so you are seeing this as a fallback.

Fri Jun 07 15:38:07 CST 2019
There was an unexpected error (type=Not Found, status=404).
No message available

 對于用戶來說非常不友好。

本文主要講解如何在SpringBoot應用中使用統(tǒng)一異常處理。

實現方式

  • 第一種:使用@ControllerAdvice和@ExceptionHandler注解
  • 第二種: 使用ErrorController類來實現。

第一種:使用@ControllerAdvice和@ExceptionHandler注解

@Slf4j
@ControllerAdvice
public class GlobalExceptionHandler {

  @ResponseBody
  @ExceptionHandler(NullPointerException.class)
  public BaseResult globalException(HttpServletResponse response,NullPointerException ex){


    log.info("GlobalExceptionHandler...");
log.info("錯誤代碼:" + response.getStatus());
BaseResult result = new WebResult(WebResult.RESULT_FAIL,"request error:"+response.getStatus()
                    ,"GlobalExceptionHandler:"+ex.getMessage());
    return result;
}

}

注解@ControllerAdvice表示這是一個控制器增強類,當控制器發(fā)生異常且符合類中定義的攔截異常類,將會被攔截。

可以定義攔截的控制器所在的包路徑

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface ControllerAdvice {
  @AliasFor("basePackages")
  String[] value() default {};

  @AliasFor("value")
  String[] basePackages() default {};

  Class<?>[] basePackageClasses() default {};

  Class<?>[] assignableTypes() default {};

  Class<? extends Annotation>[] annotations() default {};
}

注解ExceptionHandler定義攔截的異常類

@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface ExceptionHandler {
  Class<? extends Throwable>[] value() default {};
}

第二種: 使用ErrorController類來實現。

系統(tǒng)默認的錯誤處理類為BasicErrorController,將會顯示如上的錯誤頁面。

這里編寫一個自己的錯誤處理類,上面默認的處理類將不會起作用。

getErrorPath()返回的路徑服務器將會重定向到該路徑對應的處理類,本例中為error方法。

@Slf4j
@RestController
public class HttpErrorController implements ErrorController {

  private final static String ERROR_PATH = "/error";

  @ResponseBody
  @RequestMapping(path = ERROR_PATH )
  public BaseResult error(HttpServletRequest request, HttpServletResponse response){
    log.info("訪問/error" + " 錯誤代碼:" + response.getStatus());
    BaseResult result = new WebResult(WebResult.RESULT_FAIL,"HttpErrorController error:"+response.getStatus());
return result;
  }
  @Override
  public String getErrorPath() {
    return ERROR_PATH;
  }
}

測試

以上定義了一個統(tǒng)一的返回類BaseResult,方便前端進行處理。

package com.microblog.common.result;

import java.io.Serializable;


public class BaseResult implements Serializable {

  private static final long serialVersionUID = 1L;

  public static final int RESULT_FAIL = 0;
  public static final int RESULT_SUCCESS = 1;

  //返回代碼
  private Integer code;

  //返回消息
  private String message;

  //返回對象
  private Object data;

  public BaseResult(Integer code, String message) {
    this.code = code;
    this.message = message;
  }

  public BaseResult(Integer code, String message, Object object) {
    this.code = code;
    this.message = message;
    this.data = object;
  }


  public Integer getCode() {
    return code;
  }

  public void setCode(Integer code) {
    this.code = code;
  }

  public String getMessage() {
    return message;
  }

  public void setMessage(String message) {
    this.message = message;
  }

  public Object getData() {
    return data;
  }

  public void setData(Object data) {
    this.data = data;
  }
}

編寫一個測試控制器

@Slf4j
@RestController
@RequestMapping("/user")
public class TestController {

  @RequestMapping("/info1")
  public String test(){
   log.info("/user/info1");

   throw new NullPointerException("TestController have exception");

  }
}

1.發(fā)出一個錯誤的請求,也就是沒有對應的處理類。

從返回可以看到是由HttpErrorController類處理

{"code":0,"message":"HttpErrorController error:404","data":null}

2.發(fā)出一個正常的請求(TestController的test()處理),處理類中拋出空異樣

從返回中可以看出是由GlobalExceptionHandler類處理

{"code":0,"message":"request error:200","data":"GlobalExceptionHandler:TestController have exception"}

區(qū)別

1.注解@ControllerAdvice方式只能處理控制器拋出的異常。此時請求已經進入控制器中。

2.類ErrorController方式可以處理所有的異常,包括未進入控制器的錯誤,比如404,401等錯誤

3.如果應用中兩者共同存在,則@ControllerAdvice方式處理控制器拋出的異常,類ErrorController方式未進入控制器的異常。

4.@ControllerAdvice方式可以定義多個攔截方法,攔截不同的異常類,并且可以獲取拋出的異常信息,自由度更大。

到此這篇關于SpringBoot處理全局統(tǒng)一異常的實現的文章就介紹到這了,更多相關SpringBoot 全局統(tǒng)一異常內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Java中的運算符你知道多少

    Java中的運算符你知道多少

    這篇文章主要為大家詳細介紹了Java中的運算符,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-02-02
  • Java字符編碼簡介_動力節(jié)點Java學院整理

    Java字符編碼簡介_動力節(jié)點Java學院整理

    這篇文章主要介紹了Java字符編碼簡介,本文主要包括以下幾個方面:編碼基本知識,Java,系統(tǒng)軟件,url,工具軟件等,感興趣的朋友一起看看吧
    2017-08-08
  • 解析Java中的Field類和Method類

    解析Java中的Field類和Method類

    這篇文章主要介紹了Java中的Field類和Method類,是Java入門學習中的基礎知識,需要的朋友可以參考下
    2015-12-12
  • Mybatisplus多表關聯分頁查詢多種實現方式

    Mybatisplus多表關聯分頁查詢多種實現方式

    本文主要介紹了Mybatisplus多表關聯分頁查詢多種實現方式,包括使用XML自定義SQL、Wrapper搭配自定義SQL、使用DTO與自定義SQL及結合PageHelper實現分頁查詢,感興趣的可以了解一下
    2025-03-03
  • Redis框架Jedis及Redisson對比解析

    Redis框架Jedis及Redisson對比解析

    這篇文章主要介紹了Redis框架Jedis及Redisson對比解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-07-07
  • SpringBoot mybatis 實現多級樹形菜單的示例代碼

    SpringBoot mybatis 實現多級樹形菜單的示例代碼

    這篇文章主要介紹了SpringBoot mybatis 實現多級樹形菜單的示例代碼,代碼簡單易懂,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-05-05
  • java如何將pdf轉換成image

    java如何將pdf轉換成image

    這篇文章主要為大家詳細介紹了java如何將pdf轉換成image,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-05-05
  • FP-Growth算法的Java實現+具體實現思路+代碼

    FP-Growth算法的Java實現+具體實現思路+代碼

    FP-Growth算法比Apriori算法快很多(但是卻比不上時間,how time slipped away)。在網上搜索后發(fā)現Java實現的FP-Growth算法很少,且大多數不太能理解):太菜。所以就自己實現了一下。這篇文章重點介紹一下我的Java實現
    2021-06-06
  • Java進程間通信之消息隊列

    Java進程間通信之消息隊列

    這篇文章主要為大家詳細介紹了Java進程間通信之消息隊列,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • Java有效處理異常的三個原則

    Java有效處理異常的三個原則

    Java中異常提供了一種識別及響應錯誤情況的一致性機制,有效地異常處理能使程序更加健壯、易于調試。那么這篇文章總結了Java有效處理異常的三個原則,有需要的朋友們可以參考借鑒。
    2016-09-09

最新評論

全州县| 鸡泽县| 额济纳旗| 栾城县| 邯郸市| 荃湾区| 南江县| 乌拉特中旗| 麻阳| 天峨县| 清水县| 安达市| 永城市| 普兰店市| 宜昌市| 西乌珠穆沁旗| 桐城市| 探索| 古交市| 行唐县| 河西区| 达日县| 通化市| 新平| 葵青区| 拜城县| 雷波县| 平湖市| 巴中市| 乌拉特中旗| 宝山区| 乾安县| 广元市| 元谋县| 苏尼特左旗| 墨玉县| 灵宝市| 卓资县| 洮南市| 东光县| 固安县|