Spring Controller层统一异常处理

首页 Spring MVC Spring Controller层统一异常处理
~~~ 热烈庆祝通天技术网开业大吉 ~~~

两种最常见的解决方案:

  1. 使用 @@ControllerAdvice (或@RestControllerAdvice), @ExceptionHandler 注解实现;
  2. 通过AOP技术实现;

方案1:使用@ControllerAdvice 和 @ExceptionHandler

@ControllerAdvice 或 @RestControllerAdvice

使用@ControllerAdvice注解来增强所有的 @RequestMapping标记的方法;

官方解释: It is typically used to define @ExceptionHandler ,@InitBinder, and @ModelAttribute methods that apply to all @RequestMapping methods.

@ExceptionHandler

  • 只能声明方法;
  • @ControllerAdvice结合使用,可以用于增强所有 @RequestMapping方法的异常处理;
@RestControllerAdvice
public class ControllerExceptionHandleAdvice {
    private final static Logger logger = LoggerFactory.getLogger(ControllerExceptionHandleAdvice.class);

    @ExceptionHandler
    public ResultEntity handler(HttpServletRequest req, HttpServletResponse res, Exception e) {
        logger.info("Restful Http请求发生异常...");

        if (res.getStatus() == HttpStatus.BAD_REQUEST.value()) {
            logger.info("修改返回状态值为200");
            res.setStatus(HttpStatus.OK.value());
        }

        if (e instanceof NullPointerException) {
            logger.error("代码00:" + e.getMessage(), e);
            return ResultEntity.fail("发生空指针异常");
        } else if (e instanceof IllegalArgumentException) {
            logger.error("代码01:" + e.getMessage(), e);
            return ResultEntity.fail("请求参数类型不匹配");
        } else if (e instanceof SQLException) {
            logger.error("代码02:" + e.getMessage(), e);
            return ResultEntity.fail("数据库访问异常");
        } else {
            logger.error("代码99:" + e.getMessage(), e);
            return ResultEntity.fail("服务器代码发生异常,请联系管理员");
        }
    }
}

方案2:通过AOP技术实现

  • @Aspect 注解;
  • 织入点:
    • 方法返回值为:ResultEntity
    • 所有带有controller层级的包 下面的 所有类的所有方法
    • @Around("execution(public com.test.model.ResultEntity com...controller...*(..))")
@Component
@Aspect
public class ControllerAspect {
    public static final Logger logger = LoggerFactory.getLogger(ControllerAspect.class);

    @Around("execution(public com.test.model.ResultEntity com..*.controller..*.*(..))")
    public Object handleControllerMethod(ProceedingJoinPoint pjp) {
        Stopwatch stopwatch = Stopwatch.createStarted();

        ResultEntity<?> resultEntity;
        try {
            logger.info("执行Controller开始: " + pjp.getSignature() + " 参数:" + Lists.newArrayList(pjp.getArgs()).toString());
            resultEntity = (ResultEntity<?>) pjp.proceed(pjp.getArgs());
            logger.info("执行Controller结束: " + pjp.getSignature() + ", 返回值:" + resultEntity.toString());
            logger.info("耗时:" + stopwatch.stop().elapsed(TimeUnit.MILLISECONDS) + "(毫秒).");
        } catch (Throwable throwable) {
            resultEntity = handlerException(pjp, throwable);
        }

        return resultEntity;
    }

    private ResultEntity<?> handlerException(ProceedingJoinPoint pjp, Throwable e) {
        ResultEntity<?> resultEntity = null;
        if (e instanceof RuntimeException) {
            logger.error("RuntimeException{方法:" + pjp.getSignature() + ", 参数:" + pjp.getArgs() + ",异常:" + e.getMessage() + "}", e);
            resultEntity = ResultEntity.fail(e.getMessage());
        } else {
            logger.error("异常{方法:" + pjp.getSignature() + ", 参数:" + pjp.getArgs() + ",异常:" + e.getMessage() + "}", e);
            resultEntity = ResultEntity.fail(e.getMessage());
        }

        return resultEntity;
    }
}
复制链接 资源下载
资源下载

本文没有可供下载资源

点击下载

标题:Spring Controller层统一异常处理

分类:Spring MVC

链接:https://www.aqwdzy.com/content/144

版权:通天技术网(www.aqwdzy.com)所分享发布内容,部分为网络转载,如有侵权请立即联系方式,我们第一时间删除并致歉!

评论

电子邮件地址不会被公开。 必填项已用 * 标注

  • 通天技术网
    回复

    热烈庆祝通天技术网开业大吉

  • 通天技术网
    回复

    热烈庆祝通天技术网开业大吉

    相关文章