@ControllerAdvice注解,實(shí)現(xiàn)異常的統(tǒng)一處理

一、介紹

  1. @ControllerAdvice注解是Spring3.2中新增的注解,作用是給Controller控制器添加統(tǒng)一的操作或處理,當(dāng)然包含對(duì)異常的處理。

二、實(shí)現(xiàn)

  1. 自定義一個(gè)GlobalExceptionHandler,并添加注解@ControllerAdvice(basePackages = {"com.xxx.controller"})
    這個(gè)basePackages 表示哪些controller需要這個(gè)GlobalExceptionHandler處理異常。代碼如下:
@ControllerAdvice(basePackages = {"cn.xxx.controller"})
@Slf4j
public class GlobalExceptionHandler {

    /**
     * 處理全局的異常
     *
     * @param e
     * @return
     */
    @ExceptionHandler(HuiXunBaseException.class)
    @ResponseBody
    WebResponse handleException(HttpServletRequest request, HuiXunBaseException e) {
        HashMap<String, Object> data = Maps.newHashMap();
        data.put("url", request.getRequestURL().toString());
        data.put("params", e.getParams());
        log.error("", e);
        return WebResponse.getInitWebResponse(e.getStatus(), e.getMessage(), data);
    }
}

注意一下,這個(gè)方法(handleException)的參數(shù)。如果有自定的參數(shù)的話,這個(gè)異常的處理方法是不生效的,原因可以自行了解。@ResponseBody表示異常處理的返回給客戶端的結(jié)果是以json字符串的形式處理,當(dāng)然也可以使用其他的形式,比如ModelAndView。

  1. 自定義的異常代碼:
    自定義基類(lèi)異常的代碼:
/**
 * @author ww
 * @version 1.0
 * @Date 2019/12/12
 */
@Data
@NoArgsConstructor
public class HuiXunBaseException extends Exception{

    /**
     * 響應(yīng)給客戶端的狀態(tài)碼
     */
    private int status;

    /**
     * 異常產(chǎn)生的方法的 參數(shù)
     */
    private Object params;

    /**
     *
     * @param msg
     */
    public HuiXunBaseException(String msg){
        super(msg);
    }
    public HuiXunBaseException(int status, String msg, Object params){
        super(msg);
        this.status = status;
        this.params = params;
    }
}

自定義業(yè)務(wù)異常的代碼:

/**
 * @author ww
 * @version 1.0
 * @Date 2019/12/12
 */
public class BSVBusinessException extends HuiXunBaseException {
    /**
     * @param status
     * @param msg
     * @param params
     */
    public BSVBusinessException(int status, String msg, Object params) {
        super(status, msg, params);
    }
}
  1. 統(tǒng)一響應(yīng)給客戶端的格式代碼:
/**
 * @author ww
 * @version 1.0
 * @Date 2019/5/27
 */
@Data
public class WebResponse<T> {
    public static class STATUS {
        // 正常
        public static final int STATUS_OK = 0;

        // 業(yè)務(wù)異常
        public static final int BIZ_ERROR = 5;
        
    }

    public static class MESSAGE {
        public static final String BIZ_ERROR_MESSAGE = "業(yè)務(wù)異常";
    }

    //請(qǐng)求狀態(tài),0: 正常返回, 1:系統(tǒng)異常, 2:權(quán)限錯(cuò)誤, 3:參數(shù)錯(cuò)誤, 4:業(yè)務(wù)異常
    private int status = STATUS.STATUS_OK;

    //請(qǐng)求數(shù)據(jù)
    private T data;

    //錯(cuò)誤碼信息
    private String message;

    public WebResponse(int status, T data, String message) {
        this.status = status;
        this.data = data;
        this.message = message;
    }

    public WebResponse() {
    }

    public <E extends WebResponse> E status(int status) {
        setStatus(status);
        return (E) this;
    }

    public <E extends WebResponse> E data(T data) {
        setData(data);
        return (E) this;
    }

    public <E extends WebResponse> E message(String message) {
        setMessage(message);
        return (E) this;
    }

    /**
     * 處理是否成功
     */
    public boolean isSuccess() {
        return this.status == STATUS.STATUS_OK;
    }

    public static WebResponse getInitWebResponse(int status, String message, Object data){
        WebResponse<Object> webResponse = new WebResponse<>();
        webResponse.setStatus(status);
        webResponse.setMessage(message);
        webResponse.setData(data);
        return webResponse;
    }
}
  1. 測(cè)試Controller
/**
 * @author ww
 * @version 1.0
 * @Date 2019/12/12
 */
@RestController
@RequestMapping(value = "/test")
public class TestExceptionController {

    /**
     * @return
     */
    @RequestMapping(value = "/exception", method = RequestMethod.GET)
    public WebResponse test(@RequestParam(value = "param") String param) throws HuiXunBaseException {
        throw new BSVBusinessException(WebResponse.STATUS.BIZ_ERROR, "發(fā)生異常啦", param);
    }
}
  1. 測(cè)試結(jié)果如下圖:


    image.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容