基本介绍
对于springboot的项目,想必下面的界面都见过吧
这个界面就是springboot的默认处理异常的界面,不管是客户端的异常还是服务器的异常都会返回这个页面。
下面是官方对于异常处理的基本介绍
By default, Spring Boot provides an mapping that handles all errors in a sensible way, and it is registered as a “global” error page in the servlet container. For machine clients, it produces a JSON response with details of the error, the HTTP status, and the exception message. For browser clients, there is a “whitelabel” error view that renders the same data in HTML format (to customize it, add a that resolves to )./errorViewerror
There are a number of properties that can be set if you want to customize the default error handling behavior. See the “Server Properties” section of the Appendix.server.error
To replace the default behavior completely, you can implement and register a bean definition of that type or add a bean of type to use the existing mechanism but replace the contents.ErrorControllerErrorAttributes
大概意思就是默认情况下,Spring Boot 提供了一个映射,以合理的方式处理所有错误,并在 servlet 容器中注册为“全局”错误页面。 对于计算机客户端,它会生成一个 JSON 响应,其中包含错误、HTTP 状态和异常消息的详细信息。 对于浏览器客户端,有一个“白标”错误视图,该视图以HTML格式呈现相同的数据
自定义异常页面
对于上面的默认页面,显然是不能清晰说明问题的,用户看见这个页面也不知道发生了什么事情,我们来看一下b站的404页面
很明显,这个页面就是自定义的404页面,下面我们就来学习一下如何在springboot的项目中自定义异常页面。https://docs.spring.io/spring-boot/docs/2.7.5/reference/htmlsingle/#web.servlet.spring-mvc.error-handling,这个是官方文档,对于异常的处理。
上面的是官方文档中的部分内容,可以知道我们要自定义错误页面,那么就要将自己写的错误页面放到error目录下,没有使用模板引擎时放到静态资源访问目录就行,如果使用了模板引擎,那么需要放到模板引擎的访问目录下。
在springboot中有一个DefaultErrorViewResolver类,这个类用来解析默认的错误视图的
通过注释,我们可以知道,如果要自定义404的页面,那么我们写一个404.html即可,如果想要处理4开头的所有错误,那么只需创建一个4xx.html页面即可。这样在发生4系列的错误时,会先精确匹配,如果没找到就会模糊匹配4xx的页面,如果还是没有那么就会返回一个默认的页面。
知道了使用方法之后,下面我们就来处理4系列的错误,自定义错误页面
上面就是我创建的404页面和4xx页面,我们再来创建一个Controller,用于产生错误的
@Controller
public class ErrorController {
@PostMapping("/err01")
public void err01() {
}
}
我们先来访问一个不存在的路径
可以发现这里已经是我们自定义的异常了,下面再来访问一下err01这个路径
上面我们是针对4系列的页面进行自定义的,对于5xx的错误的处理也是类似的,类推即可
局部&全局异常
上面我们介绍了自定义异常界面,这里我们看一下如何处理服务器中不同的异常,比如发生如ArithmeticException、NullPointerException 等时,不使用默认异常机制匹配的 xxx.html , 而是使用显示异常机制指定的错误页面,这个需求我们使用@ControllerAdvice和ExceptionHandler来完成,如果是局部异常则不需要@ControllerAdvice。这个在springmvc中学习过,就不细说了,下面是一个全局异常的例子
@Controller
public class ErrorController {
@PostMapping("/err01")
public void err01() {
}
@RequestMapping("/err02")
public void err02(String name) {
//这里会发生空指针异常
System.out.println(name.equals("123"));
}
}
可以知道/err02如果不带name参数会产生一个空指针异常,下面这个全局异常类会捕捉该异常,并返回exception目录下的npe.html页面
@ControllerAdvice
public class GlobalException {
@ExceptionHandler({NullPointerException.class})
public String handleNullPointerException(Exception e){
e.printStackTrace();
return "/exception/npe.html";
}
}
npe.html页面如下
我们来访问一下/err02,测试是否会成功捕捉异常并返回npe.html
可以发现没有问题
自定义异常
这个我们也在springmvc中说明过,这里就简单过一下,讲一个例子就行了
我们创建一个AccessException,这个异常表示无权访问,如果我们访问时没有携带id这个参数那么就抛出这个自定义异常。
自定义异常是使用@ResponseStatus来标识的,这个用于设置状态码,然后根据状态码去匹配对应的错误页面
@ResponseStatus(HttpStatus.FORBIDDEN)
public class AccessException extends RuntimeException {
}
@Controller
public class ErrorController {
@PostMapping("/err01")
public void err01() {
}
@RequestMapping("/err02")
public void err02(String name) {
//这里会发生空指针异常
System.out.println(name.equals("123"));
}
@RequestMapping("/err03")
public void err03(String id) {
if (id == null) {
throw new AccessException();
}
}
}
上面的代码我们可以知道在访问/err03时如果没有id参数就会抛出一个自定义异常,这个异常并没有上有一个@ResponseStatus注解,状态码设置的是403,我们也没有403.html页面,所以最终会返回一个4xx,html的页面。下面来访问一下/err03
可以发现确实是这样的。
总结
在springboot中的异常处理基本上是和springmvc一模一样的,这里就是简单介绍了下,如果看完文章感觉很模糊,那么去了解下springmvc中的异常机制就行了。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/146270.html