spring boot项目中如何统一处理异常

spring boot处理异常的方式有很多种,各自都有不同的优点和缺点,之前看了很多关于spring boot异常处理的博客,把我人都看晕了,越看越糊涂,不知道该用哪种异常处理方式好,最终在一个项目视频教程下看到了一个异常处理的解决方案,觉得挺好用的,在这里分享给大家

处理异常的类

该异常处理的核心是 @ControllerAdvice,@ExceptionHandler,它会拦截所有Controller层的异常

后端部分

自定义异常处理类

package com.jizhu.blog.exceptionHandler;
import...
/**
 * 此注解只扫描Controller层的异常
 */
@ControllerAdvice(annotations = Controller.class)
public class ExceptionHander{
    /**
     * 日志
     */
    private static final Logger logger= LoggerFactory.getLogger(ExceptionHander.class);

    @ExceptionHandler(Exception.class)
    public void exceptionHanders(HttpServletRequest request, Exception e, HttpServletResponse response) throws IOException {
        /**
         * 记录日志
         */
        logger.error("服务器发生异常:"+e.getMessage());
        for (StackTraceElement stackTraceElement : e.getStackTrace()) {
            logger.error(stackTraceElement.toString());
        }

        /**
         * 根据请求类型处理异常
         */
        String xRequestedWith = request.getHeader("x-requested-with");
        if("XMLHttpRequest".equals(xRequestedWith)){
            /**
             * 此请求为Ajax请求
             * 使用json格式返回
             */
            ObjectMapper mapper =new ObjectMapper();
            response.setContentType("application/json;charset=utf-8");
            mapper.writeValue(response.getOutputStream(),"服务器异常");
        }else{
            /**
             * 正常request请求
             * 跳转到500页面
             */
            response.sendRedirect(request.getContextPath()+"/500");
        }

    }
}

该异常处理类的特点就是能够根据请求是否为Ajax来进行不同的处理,服务端代码错误统一跳转自定义的500页面,如果客户端输入路径错误或者资源已经删除那么自动跳转自定义404页面,如果是Ajax请求那么同样也会以Json格式返回。

Controller层页面跳转处理
在这里插入图片描述

前端部分

自定义404页面必须按照此目录结构放,resource->templates->error->404.html,这样spring boot才会自动跳转到404页面,自定义500页面就可以随便放了,因为需要在Controller层跳转,不过我个人就跟404.html放在同一级目录了
自定义错误页面目录结构
在这里插入图片描述

测试Demo

500错误测试

页面
在这里插入图片描述
控制台
在这里插入图片描述
日志
在这里插入图片描述

404错误测试
页面
在这里插入图片描述
Ajax请求测试

页面
在这里插入图片描述
控制台
在这里插入图片描述
日志
在这里插入图片描述

完事儿~


版权声明:本文为weixin_41639009原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。