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