Spring Boot 全局异常处理
一、ErrorPageRegistrar
异常处理
1.1ErrorPageRegistrar
详解
Spring Boot 为我们提供了统一异常处理方式。通过实现ErrorPageRegistrar
接口来注册异常错误提示页面。
下面是去掉注释后的ErrorPageRegistrar
接口,该接口只有一个registerErrorPages()
方法,通过该方法来注册错误提示页面。
public interface ErrorPageRegistrar {
void registerErrorPages(ErrorPageRegistry registry);
}
registerErrorPages()
方法中有一个ErrorPageRegistry
类型的参数registry
,下面是ErrorPageRegistry
接口的源码。ErrorPageRegistry
接口中提供了一个addErrorPages()
方法,这个方法允许传入多个错误信息页面。
public interface ErrorPageRegistry {
void addErrorPages(ErrorPage... errorPages);
}
下面是ErrorPage
其中的两个构造函数。
到这里我们大概就知道其使用方式了。
1.2ErrorPageRegistrar
实现
错误提示页面。
CommonErrorPageRegistrar
类
@Component
public class CommonErrorPageRegistrar implements ErrorPageRegistrar {
@Override
public void registerErrorPages(ErrorPageRegistry registry) {
// HttpStatus.NOT_FOUND 对应的响应码是404
ErrorPage errorPage404 = new ErrorPage(HttpStatus.NOT_FOUND, "/static/errorpage/404.html");
// HttpStatus.INTERNAL_SERVER_ERROR 对应的响应码是500
ErrorPage errorPage500 = new ErrorPage(HttpStatus.INTERNAL_SERVER_ERROR, "/static/errorpage/500.html");
// 根据ErrorPage 的构造函数不仅可以传入Http 对应状态码的枚举,还可以传入对应异常的class 对象
// ErrorPage nullPointException = new ErrorPage(NullPointerException.class, "/对应的提示页面");
registry.addErrorPages(errorPage404, errorPage500);
}
}
控制器ExceptionController
类
@Controller
public class ExceptionController {
/**
* 抛出一个数组下标越界异常,表明是服务端的错误
*/
@GetMapping("/exception500")
public void test500(){
throw new ArrayIndexOutOfBoundsException();
}
}
PS:我在application.properties
全局配置文件中设置了上下文的访问路径。
server.context-path=/springboot
当在浏览器端访问一个不存在的控制器时,会出现自定义的404 提示页面。
当访问“exception500
”时,会因为数组下标越界异常提示500 异常页面。
二、@ExceptionHandler
异常处理
@ExceptionHandler
与@ControllerAdvice
支持的全局异常处理本身在Spring MVC 中也是支持的,当然Spring MVC 还提供了其他的方式来处理异常。比如:实现HandlerExceptionResolver
来自定义异常处理器等。基于Spring 与Spring MVC 的Spring Boot 自身也支持这几种异常处理方式。这里只提到基于@ExceptionHandler
与@ControllerAdvice
注解的异常处理,对于其他的方式,如果你比较感兴趣的话,可以查阅相关资料或者博文,这里就不再一一列出了。
错误提示页面。
全局配置文件application.properties
#设置上下文访问路径
server.context-path=/springboot
#设置jsp 访问资源前缀
spring.mvc.view.prefix=/WEB-INF/views/
#设置jsp 访问资源后缀
spring.mvc.view.suffix=.jsp
全局异常处理MyExceptionHandler
类
@ControllerAdvice
public class MyExceptionHandler {
@ExceptionHandler(Exception.class)
public ModelAndView error(Exception e){
ModelAndView modelAndView = new ModelAndView();
// 封装异常信息,用于页面的渲染
modelAndView.addObject("exception", e.getClass().getName());
// 转发到error.jsp 页面,进行错误提示
modelAndView.setViewName("/error");
return modelAndView;
}
}
异常信息提示页面error.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>error</title>
</head>
<body>
<h1>出故障啦! </h1>
<!-- 获取异常信息-->
<h1>原因是: ${exception} </h1>
</body>
</html>
当访问“exception500”时
,异常页面显示如下:
上一篇: XUbuntu12.04安装QQ2011
下一篇: storm集群安装