自定義異常處理返回無效問題

前言

最近作一個項目,自定義了全局異常處理,可是返回值一直沒法返回自定義的類型。 調試了一早上,氣到吐血。終於發現問題了。html

自定義異常處理

/** * @author :Maolin * @className :GlobalExceptionHandler * @date :Created in 2019/9/2 9:08 * @description: 自定義全局異常處理 * @version: 1.0 */
@Slf4j
@ControllerAdvice
public class GlobalExceptionHandler {
    //private static final Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class);

    /** * 處理自定義的業務異常 * @param req * @param e * @return */
    @ExceptionHandler(value = BizException.class)
    public UniversalResponseBody bizExceptionHandler(HttpServletRequest req, BizException e){
        log.error("發生業務異常!緣由是:{}",e.getErrorMsg());
        return UniversalResponseBody.error(e.getErrorCode(),e.getErrorMsg());
    }

    /** * 處理空指針的異常 * @param req * @param e * @return */
    @ExceptionHandler(value =NullPointerException.class)
    public UniversalResponseBody exceptionHandler(HttpServletRequest req, NullPointerException e){
        log.error("發生空指針異常!緣由是:",e);
        return UniversalResponseBody.error(CommonEnum.BODY_NOT_MATCH);
    }


    /** * 處理其餘異常 * @param req * @param e * @return */
    @ExceptionHandler(value =Exception.class)
    public UniversalResponseBody exceptionHandler(HttpServletRequest req, Exception e){
        log.error("未知異常!緣由是:",e);
        return UniversalResponseBody.error(CommonEnum.INTERNAL_SERVER_ERROR);
    }
}
複製代碼

拋出異常

在拋出異常的地方,throws new BizException(「600」,「登陸過時「)java

BizException 是自定義異常類spring

這個看似沒有問題。可是postman測試的返回結果:post

{
    "timestamp": "2019-09-03T02:54:32.823+0000",
    "status": 404,
    "error": "Not Found",
    "message": "Token is illegal or expired",
    "trace": "com.xidian.reservation.exceptionHandler.BizException: Token is illegal or expired\r\n",
    "path": "/login/test"
}
複製代碼

很難受!!!測試

通過一早上的各類調試,終於發現了問題所在。spa

問題所在

程序補抓到異常拋出,而後全局的自定義異常處理類會捕獲,對異常進行處理,必須經過@ResponseBody註解返回JSON。指針

問題就是缺乏@ResponseBody註解,致使捕獲的異常由spring自帶的處理信息返回。調試

@Slf4j
@ControllerAdvice
public class GlobalExceptionHandler {
    //private static final Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class);

    /** * 處理自定義的業務異常 * @param req * @param e * @return */
    @ResponseBody
    @ExceptionHandler(value = BizException.class)
    public UniversalResponseBody bizExceptionHandler(HttpServletRequest req, BizException e){
        log.error("發生業務異常!緣由是:{}",e.getErrorMsg());
        return UniversalResponseBody.error(e.getErrorCode(),e.getErrorMsg());
    }

    /** * 處理空指針的異常 * @param req * @param e * @return */
    @ResponseBody
    @ExceptionHandler(value =NullPointerException.class)
    public UniversalResponseBody exceptionHandler(HttpServletRequest req, NullPointerException e){
        log.error("發生空指針異常!緣由是:",e);
        return UniversalResponseBody.error(CommonEnum.BODY_NOT_MATCH);
    }


    /** * 處理其餘異常 * @param req * @param e * @return */
    @ResponseBody
    @ExceptionHandler(value =Exception.class)
    public UniversalResponseBody exceptionHandler(HttpServletRequest req, Exception e){
        log.error("未知異常!緣由是:",e);
        return UniversalResponseBody.error(CommonEnum.INTERNAL_SERVER_ERROR);
    }
}
複製代碼

小結

必定要熟悉他的AOP流程,看他異常從哪裏拋出,返回結果是哪兒來的,才能找到問題。code

相關文章
相關標籤/搜索