SpringMVC的全局異常處理

@ControllerAdvice的使用

咱們都知道作項目通常都會有全局異常統一處理的類,那麼這個類在Spring中能夠用@ControllerAdvice來實現。
@ControllerAdvice ,這是一個很是有用的註解,顧名思義,這是一個加強的 Controller。使用這個 Controller ,能夠實現三個方面的功能:java

全局異常處理
全局數據綁定
全局數據預處理
靈活使用這三個功能,能夠幫助咱們簡化不少工做,須要注意的是,這是 SpringMVC 提供的功能,在 Spring Boot 中能夠直接使用。web

package com.boss.hr.train.fishkkmybatis.handle;

import com.boss.hr.train.fishkkmybatis.entity.Result;
import com.boss.hr.train.fishkkmybatis.enums.DictionaryEnum;
import com.boss.hr.train.fishkkmybatis.exception.BaseException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.validation.BindException;
import org.springframework.validation.ObjectError;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.ArrayList;
import java.util.List;

/**
 * ExceptionHandel
 * 全局異常處理類
 *
 * @author fishkk
 * @version 1.0
 * @since 2019/7/27
 */
@ControllerAdvice
public class ExceptionHandle {
    private final static Logger logger = LoggerFactory.getLogger(ExceptionHandle.class);

    /**
      * 全局異常處理
      * 自定義異常  表單驗證異常 和 未定義系統異常的處理
      * 轉換成Result對象返回
      * @author fishkk
      * @since  2019/7/28
      * @param  e 被捕獲的異常
      * @return  Result
      */
    @ExceptionHandler(value = Exception.class)
    @ResponseBody
    public Result handle(Exception e){
        if (e instanceof BaseException) {
            // 系統內部異常
            BaseException exception = (BaseException) e;
            return new Result<Object>(exception.getResultEnum(), null);
        }
        if(e instanceof BindException){
            // @Valid表單驗證不經過
            BindException bindException = (BindException)e;
            List<ObjectError> errors = bindException.getAllErrors();
            List<String> errorMessages = new ArrayList<>();
            for (ObjectError objectError : errors){
                errorMessages.add(objectError.getDefaultMessage());
            }

            return Result.error("-300", e.getMessage());
        } else {
            logger.error("!!!系統異常!!!", e);
            return new Result<Object>(DictionaryEnum.UNKNOW_ERROR, null);
        }
    }
}

@ExceptionHandler 註解用來指明異常的處理類型,咱們這裏捕獲所有異常。而後經過異常類型的判斷進行相應的處理和封裝,返回自定義的相應類和用自定義的異常類進行枚舉構造,
這個能夠根據不一樣的實際狀況來自行更改spring

相關文章
相關標籤/搜索