一、簡介
@RestControllerAdvice 是Controller的切面, 結合 @ExceptionHandler 實現全局異常捕獲及處理。
@Slf4j
@RestControllerAdvice
public class GlobalExceptionHandler {
/**
* desc 請求參數合法性校驗
* @param exception
* @return
*/
@ResponseBody
@ExceptionHandler(MethodArgumentNotValidException.class)
public String validationBodyException(MethodArgumentNotValidException exception){
StringBuffer buffer = new StringBuffer();
BindingResult result = exception.getBindingResult();
if (result.hasErrors()) {
List<ObjectError> errors = result.getAllErrors();
errors.forEach(p ->{
FieldError fieldError = (FieldError) p;
log.error("Data check failure : object{"+fieldError.getObjectName()+"},field{"+fieldError.getField()+
"},errorMessage{"+fieldError.getDefaultMessage()+"}");
buffer.append(fieldError.getDefaultMessage()).append(",");
});
}
BaseResponse response = new BaseResponse(BaseCodeEnum.INVALID_PARAM);
response.setRespMsg(buffer.toString().substring(0, buffer.toString().length()-1));
return JSONObject.toJSONString(response);
}
/**
* 請求參數轉換異常
* @param exception
* @return
*/
@ExceptionHandler(HttpMessageConversionException.class)
public String parameterTypeException(HttpMessageConversionException exception){
log.error(exception.getMessage());
return ResultUtil.returnException(BaseCodeEnum.INVALID_PARAM);
}
/**
* 缺少參數
* @param ex
* @return
*/
@ResponseBody
@ExceptionHandler( ServletRequestBindingException.class)
public String validationBodyException(Exception ex){
log.error(ex.getMessage());
return ResultUtil.returnException(BaseCodeEnum.MISSING_PARAMS);
}
/**
* @param requet
* @param e
* @return
* @throws Exception
*/
@ExceptionHandler(value = Exception.class)
@ResponseBody
public BaseResponse errorHandler(HttpServletRequest requet, Exception e) throws Exception {
BaseResponse response = new BaseResponse();
log.error(e.getMessage(), e);
if (e instanceof CommonException) {
CommonException commonException = (CommonException) e;
response.setRespCode(commonException.getResp_code());
response.setRespMsg(commonException.getResp_msg());
} else if (e instanceof CommonRuntimeException) {
CommonRuntimeException commonRuntimeException = (CommonRuntimeException) e;
response.setRespCode(commonRuntimeException.getResp_code());
response.setRespMsg(commonRuntimeException.getResp_msg());
} else {
response = new BaseResponse(BaseCodeEnum.UNKNOWN_EXCEPTION);
}
return response;
}
}
二、錯誤整理
1、@RestControllerAdvice 未生效
原因:a、檢查 scanBasePackage 配置的報路徑,是否包含@RestControllerAdvice注釋的類
b、檢查注解是否添加
c、檢查啟動日志是否包含 @RestControllerAdvice 類信息

2、不同jar都包含@RestControllerAdvice 注解類,就一個生效
原因:@RestControllerAdvice 有加載順序,先依賴的jar先加載其中的 @RestControllerAdvice 注解類,注解類里面的 @ExceptionHandler 也會按照順序加載,如果加載到頂級異常 Exception 的捕獲方法,那么后續加載的Exception的子類就會失效
解決方法 :調整jar包的映入順序,把對頂級異常Exception的捕獲放到最后引入
