@RestControllerAdvice注解 @ExceptionHandler注解

Posted xiaoovo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了@RestControllerAdvice注解 @ExceptionHandler注解相关的知识,希望对你有一定的参考价值。

RestControllerAdvice+ExceptionHandler这两个注解的组合,被用作项目的全局异常处理。一旦项目中发生了异常,就会进入使用了RestControllerAdvice注解类中使用了ExceptionHandler注解的方法。
下面是一些项目全局异常的处理

@ControllerAdvice(annotations = RestController.class, Controller.class )
@ResponseBody
@Slf4j
public class GlobalExceptionHandler 
    @ExceptionHandler(SQLIntegrityConstraintViolationException.class)
    public R<String> excptionHandler(SQLIntegrityConstraintViolationException e)
        log.error(e.getMessage());
        String message = e.getMessage();
        String[] s = message.split(" ");
        if (message.contains("Duplicate"))
            return R.error(s[2]+"already exists");
        
        return R.error("false");
    
    @ExceptionHandler(CustomException.class)
    public R<String> excptionHandler(CustomException e)
        log.error(e.getMessage());

        return R.error(e.getMessage());
    

@RestControllerAdvice
public class GlobalExceptionHandler 

    @ExceptionHandler(Exception.class)
    public RespBean ExceptionHandler(Exception e) 
        if (e instanceof GlobalException) 
            GlobalException exception = (GlobalException) e;
            return RespBean.error(exception.getRespBeanEnum());
         else if (e instanceof BindException) 
            BindException bindException = (BindException) e;
            RespBean respBean = RespBean.error(RespBeanEnum.BIND_ERROR);
            respBean.setMessage("参数校验异常:" + bindException.getBindingResult().getAllErrors().get(0).getDefaultMessage());
            return respBean;
        
        System.out.println("异常信息" + e);
        return RespBean.error(RespBeanEnum.ERROR);
    

@RestControllerAdvice 全局拦截异常


在spring 3.2中,新增了@ControllerAdvice 注解,可以用于定义@ExceptionHandler、@InitBinder、@ModelAttribute,并应用到所有@RequestMapping中。


/**
* 全局异常处理器 * * @author*/ @RestControllerAdvice public class GlobalExceptionHandler { private static final Logger log = LoggerFactory.getLogger(GlobalExceptionHandler.class); /** * 权限校验失败 如果请求为ajax返回json,普通请求跳转页面 */ @ExceptionHandler(AuthorizationException.class) public Object handleAuthorizationException(HttpServletRequest request, AuthorizationException e) { log.error(e.getMessage(), e); if (ServletUtils.isAjaxRequest(request)) { return AjaxResult.error(PermissionUtils.getMsg(e.getMessage())); } else { ModelAndView modelAndView = new ModelAndView(); modelAndView.setViewName("error/unauth"); return modelAndView; } } /** * 请求方式不支持 */ @ExceptionHandler({ HttpRequestMethodNotSupportedException.class }) public AjaxResult handleException(HttpRequestMethodNotSupportedException e) { log.error(e.getMessage(), e); return AjaxResult.error("不支持‘ " + e.getMethod() + "‘请求"); } /** * 拦截未知的运行时异常 */ @ExceptionHandler(RuntimeException.class) public AjaxResult notFount(RuntimeException e) { log.error("运行时异常:", e); return AjaxResult.error("运行时异常:" + e.getMessage()); } /** * 系统异常 */ @ExceptionHandler(Exception.class) public AjaxResult handleException(Exception e) { log.error(e.getMessage(), e); return AjaxResult.error("服务器错误,请联系管理员"); } /** * 业务异常 */ @ExceptionHandler(BusinessException.class) public Object businessException(HttpServletRequest request, BusinessException e) { log.error(e.getMessage(), e); if (ServletUtils.isAjaxRequest(request)) { return AjaxResult.error(e.getMessage()); } else { ModelAndView modelAndView = new ModelAndView(); modelAndView.addObject("errorMessage", e.getMessage()); modelAndView.setViewName("error/business"); return modelAndView; } } /** * 自定义验证异常 */ @ExceptionHandler(BindException.class) public AjaxResult validatedBindException(BindException e) { log.error(e.getMessage(), e); String message = e.getAllErrors().get(0).getDefaultMessage(); return AjaxResult.error(message); } }

 

以上是关于@RestControllerAdvice注解 @ExceptionHandler注解的主要内容,如果未能解决你的问题,请参考以下文章

@RestControllerAdvice 全局拦截异常

@RestControllerAdvice作用及原理

@RestControllerAdvice作用及原理

spring统一错误响应设置

spring boot 2 统一异常处理

springboot-异常处理