@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