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

SpringBoot實現(xiàn)全局異常處理方法總結(jié)

 更新時間:2022年03月04日 11:19:12   作者:springboot葵花寶典  
在項目開發(fā)中出現(xiàn)異常時很平常不過的事情,我們處理異常也有很多種方式。本文將詳細為大家講解SpringBoot實現(xiàn)全局異常處理幾種方法,感興趣的可以學(xué)習(xí)一下

在項目開發(fā)中出現(xiàn)異常時很平常不過的事情,我們處理異常也有很多種方式,可能如下:

public int div(int a ,int b){
        int c=0;
        try{
           c=a/b;
        }catch (Exception ex){
            ex.printStackTrace();
        }
        return  c;
    }

如果我們這樣處理異常,代碼中就會出現(xiàn)特別多的異常處理模塊,這樣代碼就會變得可讀性非常差,而且業(yè)務(wù)模塊邏輯會夾雜特別多的非業(yè)務(wù)邏輯。但是在項目開發(fā)的過程中我們應(yīng)該將主要精力放在業(yè)務(wù)模塊,除了必要的異常處理模塊最好不要再包含其他無關(guān)緊要的代碼。那么我們?nèi)绾翁幚眄椖恐袩o處不在的異常呢?這就引出了我們要介紹的全局異常處理方法,主要有兩種種方式:

HandlerExceptionResolver。

@ControllerAdvice+@ExceptionHandler 今天我們主要介紹一下@ControllerAdvice+@ExceptionHandler模式處理全局異常。

全局異常處理

首先我們先介紹一下@ControllerAdvice和@ExceptionHandler

@ControllerAdvice注解: 他是一個比較特殊的@Component,用于定義全局異常處理類作用在所有的@Controller類型的接口上。

@ExceptionHandler注解: 用于聲明處理異常的方法。

配置全局異常

@ControllerAdvice+@ExceptionHandler只要設(shè)計得當(dāng),就不用再在Controller使用trg-catch了!下面我們先寫介紹一個Controller層全局異常處理類。

@ControllerAdvice
public class GlobalExceptionHandler {
   @ResponseBody
    @ExceptionHandler(Exception.class)
    public CommonResult exceptionHandler(HttpServletRequest request, Exception exception) throws Exception {    
        Map<String, Object> result = new HashMap<>(3);
        String message =exception.getMessage()+request.getRequestURL().toString();
        return CommonResult.failed(message);
    }
}

注:@ResponseBody的作用其實是將java對象轉(zhuǎn)為json格式的數(shù)據(jù)。然后到這里為止,一個簡單的全局異常處理解決方式就完成了,這只是一個簡單的異常處理方式,遠遠不能達到完整項目中全局異常處理的方案。

全局異常處理的升級

我們項目中業(yè)務(wù)處理,可以通過自定義的異常知道哪一個模塊發(fā)生異常,并且不同的業(yè)務(wù)模塊也有不同的異常處理方式,這也方便我們做擴展

public class ServiceException extends RuntimeException {
    private IErrorCode errorCode;
    public ServiceException(IErrorCode errorCode) {
        super(errorCode.getMessage());
        this.errorCode = errorCode;
    }
    public ServiceException(String message) {
        super(message);
    }
    public ServiceException(Throwable cause) {
        super(cause);
    }
    public ServiceException(String message, Throwable cause) {
        super(message, cause);
    }
    public IErrorCode getErrorCode() {
        return errorCode;
    }
}

加入自定義異常處理

@ControllerAdvice
public class GlobalExceptionHandler {
    /**
     * 處理所有Service層異常
     */
    @ResponseBody
    @ExceptionHandler(value = ServiceException.class)
    public CommonResult handle(ServiceException e) {
        if (e.getErrorCode() != null) {
            return CommonResult.failed(e.getErrorCode());
        }
        return CommonResult.failed(e.getMessage());
    }
    /**
     * 處理所有不可知的異常
     */
    @ResponseBody
    @ExceptionHandler(Exception.class)
    public CommonResult exceptionHandler(HttpServletRequest request, Exception exception) throws Exception {
     
        Map<String, Object> result = new HashMap<>(3);
        String message =exception.getMessage()+request.getRequestURL().toString();
        return CommonResult.failed(message);
    }
 
}

處理 Controller 數(shù)據(jù)綁定、數(shù)據(jù)校驗的異常

在用戶登錄Model字段上注解數(shù)據(jù)校驗規(guī)則。

@Data
@EqualsAndHashCode(callSuper = false)
public class UserLoginParam {
    @NotEmpty
    private String username;
    @NotEmpty
    private String password;
}

SpringBoot中可以使用@Validated + @RequestBody注解方式實現(xiàn)數(shù)據(jù)綁定和數(shù)據(jù)校驗。例如登錄方式為:

@ApiOperation(value = "登錄以后返回token")
    @RequestMapping(value = "/login", method = RequestMethod.POST)
    @ResponseBody
    public CommonResult login(@Validated @RequestBody UmsAdminLoginParam umsAdminLoginParam) {
        String token = adminService.login(umsAdminLoginParam.getUsername(), umsAdminLoginParam.getPassword());
        if (token == null) {
            return CommonResult.validateFailed("用戶名或密碼錯誤");
        }
        Map<String, String> tokenMap = new HashMap<>();
        tokenMap.put("token", token);
        tokenMap.put("tokenHead", tokenHead);
        return CommonResult.success(tokenMap);
    }

如果數(shù)據(jù)校驗不對數(shù)據(jù)拋出的異常為MethodArgumentNotValidException,所以我們可以在全局異常處理類中添加對MethodArgumentNotValidException異常的處理聲明,就可以實現(xiàn)全局處理數(shù)據(jù)校驗和綁定的異常了,實現(xiàn)如下:

@ResponseBody
    @ExceptionHandler(value = MethodArgumentNotValidException.class)
    public CommonResult handleValidException(MethodArgumentNotValidException e) {
        BindingResult bindingResult = e.getBindingResult();
        String message = null;
        if (bindingResult.hasErrors()) {
            FieldError fieldError = bindingResult.getFieldError();
            if (fieldError != null) {
                message = fieldError.getField()+fieldError.getDefaultMessage();
            }
        }
        return CommonResult.validateFailed(message);
    }

通過上面介紹的未知異常、數(shù)據(jù)校驗和自定義全局異常所有的Controller層的異常處理方式全部都集中到了GlobalExceptionHandler類中,那么我們在Controller類中就不再需要收到記錄錯誤了。

GlobalExceptionHandler全部代碼

@ControllerAdvice
public class GlobalExceptionHandler {
    @ResponseBody
    @ExceptionHandler(value = ApiException.class)
    public CommonResult handle(ApiException e) {
        if (e.getErrorCode() != null) {
            return CommonResult.failed(e.getErrorCode());
        }
        return CommonResult.failed(e.getMessage());
    }
    @ResponseBody
    @ExceptionHandler(Exception.class)
    public CommonResult exceptionHandler(HttpServletRequest request, Exception exception) throws Exception {
        Map<String, Object> result = new HashMap<>(3);
        String message =exception.getMessage()+request.getRequestURL().toString();
        return CommonResult.failed(message);
       // return result;
    }
    @ResponseBody
    @ExceptionHandler(value = MethodArgumentNotValidException.class)
    public CommonResult handleValidException(MethodArgumentNotValidException e) {
        BindingResult bindingResult = e.getBindingResult();
        String message = null;
        if (bindingResult.hasErrors()) {
            FieldError fieldError = bindingResult.getFieldError();
            if (fieldError != null) {
                message = fieldError.getField()+fieldError.getDefaultMessage();
            }
        }
        return CommonResult.validateFailed(message);
    }
}

總結(jié)

今天主要講解了@ControllerAdvice+@ExceptionHandler進行統(tǒng)一的在Controller層上的全局異常處理。

到此這篇關(guān)于SpringBoot實現(xiàn)全局異常處理方法總結(jié)的文章就介紹到這了,更多相關(guān)SpringBoot全局異常處理內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 新手必備的IDEA常用設(shè)置總結(jié)

    新手必備的IDEA常用設(shè)置總結(jié)

    今天給大家總結(jié)了一些IDEA的常用設(shè)置,文中有非常詳細的圖文介紹,對正在學(xué)習(xí)使用IDEA的小伙伴們很有幫助,需要的朋友可以參考下
    2021-05-05
  • SpringBoot下載Excel文件時,報錯文件損壞的解決方案

    SpringBoot下載Excel文件時,報錯文件損壞的解決方案

    這篇文章主要介紹了SpringBoot下載Excel文件時,報錯文件損壞的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • IDEA java出現(xiàn)無效的源發(fā)行版14解決方案

    IDEA java出現(xiàn)無效的源發(fā)行版14解決方案

    這篇文章主要介紹了IDEA java出現(xiàn)無效的源發(fā)行版14解決方案,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-11-11
  • java使用@Scheduled注解執(zhí)行定時任務(wù)

    java使用@Scheduled注解執(zhí)行定時任務(wù)

    這篇文章主要給大家介紹了關(guān)于java使用@Scheduled注解執(zhí)行定時任務(wù)的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • java GUI實現(xiàn)學(xué)生圖書管理簡單實例

    java GUI實現(xiàn)學(xué)生圖書管理簡單實例

    這篇文章主要為大家詳細介紹了java GUI實現(xiàn)學(xué)生圖書管理簡單示例,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • Java手寫一個日志框架的示例代碼

    Java手寫一個日志框架的示例代碼

    日志框架是一種用于記錄和管理應(yīng)用程序運行時信息的軟件組件,它通常提供了一套API讓開發(fā)人員能夠在代碼中插入日志語句,下面我們就來學(xué)習(xí)一下如何手寫一個日志框架吧
    2023-12-12
  • 詳解Java中的迭代迭代器Iterator與枚舉器Enumeration

    詳解Java中的迭代迭代器Iterator與枚舉器Enumeration

    Iterator與Enumeration分別是實現(xiàn)迭代器和枚舉器類的接口,下面就帶大家來詳解Java中的迭代迭代器Iterator與枚舉器Enumeration,以及它們之間的區(qū)別.
    2016-05-05
  • 解決Spring Cloud中Feign/Ribbon第一次請求失敗的方法

    解決Spring Cloud中Feign/Ribbon第一次請求失敗的方法

    這篇文章主要給大家介紹了關(guān)于解決Spring Cloud中Feign/Ribbon第一次請求失敗的方法,文中給出了三種解決的方法,大家可以根據(jù)需要選擇對應(yīng)的方法,需要的朋友們下面來一起看看吧。
    2017-02-02
  • HashMap容量和負載因子使用說明

    HashMap容量和負載因子使用說明

    這篇文章主要介紹了HashMap容量和負載因子使用說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09
  • spring-cloud-gateway降級的實現(xiàn)

    spring-cloud-gateway降級的實現(xiàn)

    這篇文章主要介紹了spring-cloud-gateway降級的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04

最新評論

河北省| 太谷县| 和平区| 绵阳市| 麦盖提县| 冕宁县| 威远县| 台湾省| 六枝特区| 都江堰市| 固始县| 珲春市| 澎湖县| 乌拉特后旗| 汽车| 平乐县| 永修县| 车险| 石渠县| 新昌县| 喀什市| 邵武市| 敦煌市| 邻水| 宝山区| 雷波县| 壶关县| 东安县| 竹北市| 诸城市| 蒙自县| 家居| 兰溪市| 永平县| 三河市| 蒙城县| 会理县| 沧源| 木兰县| 潮州市| 丽江市|