三、SpringBoot异常处理(SpringBoot系列)
自定义异常页面
-
直接在static/error目录下添加静态页面,文件名为状态码(500.html),不用再额外设置,会返回指定页面,也支持模糊匹配 (5xx.html)
-
使用thymeleaf生成动态页面,放在thymeleaf/error 目录下,同上,文件名设为状态名,遇到错误时,会直接跳转、
-
当静态异常页面和动态异常页面两个都储存在时,优先级
thymeleaf精准匹配页面 > 静态精准匹配页面 > thymeleaf模糊匹配页面 > 静态模糊匹配页面
自定义异常页面的原理
建议自己在ErrorMvcAutoConfiguration中跟一下源码
-
在ErrorMvcAutoConfiguration 类中静态内部类DefaultErrorViewResolverConfiguration中提供了
DefaultErrorViewResolver
-
DefaultErrorViewResolver中resolveErrorView()方法
- 从SpringBoot默认四个放置静态文件的目录中匹配
自定义异常数据:
ErrorMvcAutoConfiguration类中提供了一个DefaultErrorAttributes处理异常数据,我们可以直接继承DefaultErrorAttributes,重写接口ErrorAttributes中getErrorAttrobutes()方法,基于DefaultErrorAttributes已经处理过的异常数据进行修改(若直接继承ErrorAttributes重写方法,还需要自己处理异常,比较麻烦):
实现:
@Component
public class MyErrorAttribute extends DefaultErrorAttributes {
@Override
public Map<String, Object> getErrorAttributes(WebRequest webRequest, boolean includeStackTrace) {
Map<String, Object> map = super.getErrorAttributes(webRequest, includeStackTrace);
map.put("myError", "自定义的异常信息!");
return map;
}
}
自定义异常视图:
异常处理视图和 自定义异常页面 默认都是DefaultErrorViewResolver处理的,若想自定义,也可继承DefaultErrorViewResolver,基于它的基础进行修改
实现:
@Component
public class MyErrorViewResolver extends DefaultErrorViewResolver {
public MyErrorViewResolver(ApplicationContext applicationContext, ResourceProperties resourceProperties) {
super(applicationContext, resourceProperties);
}
@Override
public ModelAndView resolveErrorView(HttpServletRequest request, HttpStatus status, Map<String, Object> model) {
// model是异常数据,是不可修改map
// 我们也可以直接在这里自定义异常数据,不过要新建一个map,在把值赋值过去
ModelAndView mv = new ModelAndView();
mv.setViewName("error");
mv.addAllObjects(model);
return mv;
}
}