原创

SpringBoot异常处理及自定义异常页面


SpringBoot默认情况下对于异常的处理提供了默认的错误页面,如果我们想要自定义属于自己的异常页面同时自己来处理不同类型的异常转发到不同的页面,可以进行相关的配置。

一、创建错误页面目录

在这里插入图片描述 在template目录下创建一个名为error的目录,目录名必须是error,这样项目启动SpringBoot就会自动找到该目录下的错误页面。错误页面的名称以4xx.html或者5xx.html为例,SpringBoot会根据状态码进行对应的跳转。

那么,如何实现不同的状态码跳转到不同的页面,例如,404异常我希望跳转到404.html页面,其他的异常和错误都跳转到error.html页面。

在此,可以通过自定义拦截器来拦截Controller中的异常来完成以上功能。

二、自定义NotfoundException异常(404)

/**
 * 自定义异常类,该类表示找不到资源抛出的异常
 */
@ResponseStatus(HttpStatus.NOT_FOUND)   //返回的状态码,表示该异常为找不到资源异常
public class NotfoundException extends RuntimeException {
    public NotfoundException() {
    }

    public NotfoundException(String message) {
        super(message);
    }

    public NotfoundException(String message, Throwable cause) {
        super(message, cause);
    }
}

@ResponseStatus注解解析:

该注解有两个参数:value表示设置异常的状态码,reason表示异常的描述。

  • 该注解用在自定义异常类上时可以用来发送异常的状态码,例如HttpStatus.NOT_FOUND表示404异常。
  • 该注解用在方法上时,不管方法内部有没有发生异常,该方法一定会抛出异常,如果方法内部没有发生异常,则该方法会执行完毕。

三、定义拦截器拦截Controller中的所有异常

/**
 * 该类为控制器异常的拦截器,用于拦截所有Controller中发生的异常然后转发到自定义的异常界面
 */
@ControllerAdvice  //该注解表示拦截所有带有@Controller注解的类
public class ControllerExecptionHandler {

    private final Logger logger= LoggerFactory.getLogger(this.getClass());   //获取日志对象记录日志信息

    @ExceptionHandler(Exception.class)   //表示该方法可以进行异常处理,对Exception下的异常进行处理
    public ModelAndView execptionHandler(HttpServletRequest request,Exception e) throws Exception {
        logger.error("Request URL : {},Exception : {}",request.getRequestURL(),e);  //记录请求的url和异常信息

        //该异常处理拦截器会拦截所有的Exception,也包含自定义的异常,也就是说自定义的404异常也会跳转到错误页面,所以在此要进行分支排除
        if(AnnotationUtils.findAnnotation(e.getClass(), ResponseStatus.class)!=null){
            throw e;   //通过异常是否使用注解自定义了状态码的方式来筛选出我们自定义的异常
        }

        ModelAndView mv=new ModelAndView();
        mv.addObject("url",request.getRequestURL());
        mv.addObject("exception",e);
        mv.setViewName("error/error");
        //将请求的url和异常信息都保存到ModelAndView中传递到前台自定义的error页面
        return mv;
    }
}

该拦截器可以拦截指定包下的所有异常,在此我将所有的异常信息和请求信息都通过Logger对象打印在日志中,并且保存到ModelAndView对象发送到error.html页面。但是通过if分支结构将自定义的404异常筛选出来了,并且抛出。

在此就实现了404异常不会被拦截,默认被SpringBoot框架分配到/error/404.html页面,而其他异常则被拦截处理,跳转到error.html页面。

四、error.html页面处理

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="UTF-8">
    <title>错误</title>
</head>
<body>
    <h1>错误</h1>
    <div>
        <div th:utext="'&lt;!--'" th:remove="tag"></div>
        <div th:utext="'Failed Request URL : ' + ${url}" th:remove="tag"></div>
        <div th:utext="'Exception message : ' + ${exception.message}" th:remove="tag"></div>
        <ul th:remove="tag">
            <li th:each="st : ${exception.stackTrace}" th:remove="tag"><span th:utext="${st}" th:remove="tag"></span></li>
        </ul>
        <div th:utext="'--&gt;'" th:remove="tag"></div>
    </div>
</body>
</html>

eror.html页面代码如上,除了显示给用户的提示信息之外,异常的相关信息不会被展示出来,但是可以通过右键查看网页源代码的形式查看相关信息。

java
  • 作者:德玛西亚!(联系作者)
  • 发表时间:2020-02-26
  • 版权说明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)
  • 公众号转载:请在文末添加作者公众号二维码

留言板

留言