@RestControllerAdvice 異常分析


一、簡介

  @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的捕獲放到最后引入

      

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM