小言_互联网的博客

SpringBoot系列记录(九)——从默认处理机制到优雅的统一异常处理

363人阅读  评论(0)

一、SpringBoot默认错误处理

新建SpringBoot项目,pom.xml


  
  1. <dependency>
  2. <groupId>org.springframework.boot </groupId>
  3. <artifactId>spring-boot-starter-thymeleaf </artifactId>
  4. </dependency>
  5. <dependency>
  6. <groupId>org.springframework.boot </groupId>
  7. <artifactId>spring-boot-starter-web </artifactId>
  8. </dependency>

先只创建一个TestController,此处写个除零异常,请求这个路径它会报500错误

 运行项目,请求路径:渲染了这样一个页面,它说没有匹配到/error

 这说明它是有自动配置这些问题的,SpringBoot它默认是会去找/error路径对应的页面,如果没找到才会渲染这个页面。那我们就顺藤摸瓜,来下图这个自动配置里找一下。

 先看BasicErrorController  如果请求头中的Content-Type是text/html 

 那就创建一个error页面看看它是否会跳转去:

 再次请求后,确实跳到这个页面了

 再来看一下DefaultErrorViewResolver(默认的错误视图解析):这里如果模板引擎可以解析这个视图地址就用模板引擎解析,模板引擎可用的情况下就返回errorViewName指定的视图地址。模板引擎不可用就去静态资源文件夹下找errorViewName对应的视图。而resolveErrorView 可以很明显看到它是根据状态码定制页面了。

 二、实现ErrorController自定义错误页面

新建CustomErrorController 实现ErrorController,在templates文件夹下新建exception文件夹,对应状态码定义几个页面,为区分error页面,我在新建的error页面中输入 模板引擎错误页

 运行项目发起请求

 

 三、@ControllerAdvice@ExceptionHandler实现

新建一个全局异常处理类 GlobalExceptionHandler  这里的@Controller@RestController或者@RestControllerAdvice要灵活运用。我这里要返回一个视图


  
  1. @Controller
  2. @ControllerAdvice
  3. public class GlobalExceptionHandler {
  4. @ExceptionHandler(value = Exception.class)
  5. public Object doExceptionHandler(Exception e, HttpServletRequest request){
  6. ModelAndView mav = new ModelAndView();
  7. mav.addObject( "message", e);
  8. mav.addObject( "url", request.getRequestURL());
  9. mav.setViewName( "exception/error");
  10. return mav;
  11. }
  12. }

修改error模板:


  
  1. <!DOCTYPE html>
  2. <html lang="en" xmlns:th="http://www.w3.org/1999/xhtml">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>error </title>
  6. </head>
  7. <body>
  8. <h1>模板引擎错误页 </h1>
  9. <h2 th:text="${message}"> </h2>
  10. <h2 th:text="${url}"> </h2>
  11. </body>
  12. </html>

运行项目,再次请求

 四、扩展

想一想,如何把这一篇与 上一篇 封装统一返回数据格式  做个结合?

快动手试试吧

本篇代码:https://gitee.com/wanglonewalker/demohouse.git


转载:https://blog.csdn.net/QingXu1234/article/details/105725286
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场