默认异常处理机制
-
springboot底层提供了BasicErrorController控制器,用来处理/error错误请求
-
springboot在映射请求时,一旦出现异常信息,就会转发一个新的错误请求/error
- 浏览器请求服务器,服务器将请求交个springboot
1.情况1:springboot没有找到与之匹配的映射(文件资源,操作资源),此时就会有404错误
springboot会转发404错误,转发的请求是/error
2.情况2:springboot找到了与之匹配的请求,调用对应controller方法
在controller方法执行过程中产生了异常(controller,service,dao),此时就会有500错误
springboot会转发这个500错误,转发的请求就是/error
- 浏览器请求服务器,服务器将请求交个springboot
-
BasicErrorController做了什么处理呢?
+ 不同的设备发送相同的请求,产生相同的错误结果,会有不同的错误显示
1.浏览器发送请求,会看到一个错误页面
image.png2.接口工具发送请求,会看到一个json数据
-
底层如何区分请求设备的不同呢?
浏览器请求的值 image.png
1.根据请求头中accept的值
swagger(设备)请求的值
image.png -
看下源码
image.png
指定错误页
-
实际开发中,出现错误后,不应该给用户显示一个空白页面,应该显示一个较为友好的错误页面
-
具体方式如下
1.在resources中创建public文件夹,创建error文件夹,在文件夹中根据错误码提供对应的错误页面- 注意1:可以提供4xx.html 或者 5xx.html 作为所有4开头错误页面
- 注意2:如果404和xxx同时存在,会优先404错误页面显示
2.在resources/templates中创建error文件夹,在文件夹中提供错误页 400.html、4xx.html
与方式一不同的是,方式一提供的错误页都是静态页,内容不能改变
方式二提供的错误页都是动态页面,可以动态更改数据
注意:方式一和方式二同时存在,方式二优先生效3.自定义错误视图处理器,可以自定义根据不同的错误码,提供不同的错误页面
注意:一旦提供了自定义错误视图解析器,默认的错误视图解析器就无效了。
@Component
public class MyErrorViewResover implements ErrorViewResolver{
public ModelAndView resolveErrorView(HttpServlet req,HttpStatus status,Map<String Object> model){
ModelAndView mv = new ModelAndView();
if(status == HttpStatus.NOT_FOUND){
mv.setViewName("error/notFound");
mv.addObject("msg","资源不存在");
}else{
mv.setViewName("error/5xx");
}
return mv;
}
}
网友评论