博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Springboot学习05-自定义错误页面完整分析
阅读量:6828 次
发布时间:2019-06-26

本文共 3994 字,大约阅读时间需要 13 分钟。

 Springboot学习06-自定义错误页面完整分析

前言

   接着上一篇博客,继续分析Springboot错误页面问题

正文

 

1-自定义浏览器错误页面(只要将自己的错误页面放在指定的路径下即可)

 1-1-Springboot错误页面匹配机制(以404错误为例):

  • 1-在模板引擎下:找templates/error/404.html;如果没有,则继续匹配
  • 2-在模板引擎下:找templates/error/4XX.html;如果没有,则继续匹配
  • 3-在静态资源下:找static/error/404.html;如果没有,则继续匹配
  • 4-匹配最后的“围墙”:WhiteLevel Erro Page页面

  1-2-补充说明

  • 1-模板引擎下的匹配规则;源码分析,请参考本人博客:
  • 2-静态资源下的错误页面,不一定在static路径下,只需要符合静态资源映射规则即可;源码分析,请参考本人博客:
  • 3-WhiteLevel Erro Page页面是动态生成,源码分析,请参考本人博客:

 1-3-demo示例

 

 

 

 

 

 

  1-4-简单自定义页面的缺陷

  • 1-只能展示Springboot默认的返回信息:timestamp时间戳;status状态;error错误提示;exception异常对象;message异常消息等简单返回信息;无法返回自定义业务数据

 

2-自定义错误的json

 2-1-源码分析

//1-自定义Exceptionpublic class DataException extends RuntimeException {    public DataException() {            super("数据不存在!");    }}//2-自定义handleException方法@ControllerAdvicepublic class MyExceptionHandler {    @ResponseBody    @ExceptionHandler(DataException.class)    public Map
handleException(Exception e){ Map
map = new HashMap
(); map.put("code","data error"); map.put("msg",e.getMessage()); return map; }} //3-测试接口@Controllerpublic class DemoController { @GetMapping(value="test") public String toExceptionPage( ){ throw new DataException(); }}

 

2-2-页面效果

 2-3-缺点:浏览器请求也返回了json数据;不符合期望

 

3-自定义错误页面,自适应浏览器请求和客户端请求

 3-1-源码示例

//1-自定义Exceptionpublic class DataException extends RuntimeException {    public DataException() {            super("数据不存在!");    }}//2-自定义handleException方法@ControllerAdvicepublic class MyExceptionHandler {    @ExceptionHandler(DataException.class)    public String handleException(Exception e, HttpServletRequest request){        //传入我们自己的错误状态码 4xx 5xx,否则就不会进入定制错误页面的解析流程        request.setAttribute("javax.servlet.error.status_code",500);        Map
map = new HashMap
(); map.put("code","data error"); map.put("msg",e.getMessage()); return "forward:/error"; }} //3-测试接口@Controllerpublic class DemoController { @GetMapping(value="test") public String toExceptionPage( ){ throw new DataException(); }}

  3-2-demo示例

  3-3-缺点:虽然已经兼容了浏览器请求和客户端请求;但是无法展示业务数据

 

4-自定义页面终版:自适应浏览器请求和客户端请求,并且允许返回业务数据

 4-1-源码解析

//1-自定义ErrorAttributes@Componentpublic class MyErrorAttributes extends DefaultErrorAttributes {  //重写getErrorAttributes方法-添加自己的项目数据    public Map
getErrorAttributes(WebRequest webRequest, boolean includeStackTrace) { Map
errorAttributes = super.getErrorAttributes(webRequest,includeStackTrace); errorAttributes.put("myName","我不吃番茄");//自定义数据 errorAttributes.put("myAge","不告诉你");//自定义数据 return errorAttributes; }}//2-自定义Exceptionpublic class DataException extends RuntimeException { public DataException() { super("数据不存在!"); }}//3-自定义handleException方法@ControllerAdvicepublic class MyExceptionHandler { @ExceptionHandler(DataException.class) public String handleException(Exception e, HttpServletRequest request){ //传入我们自己的错误状态码 4xx 5xx,否则就不会进入定制错误页面的解析流程 request.setAttribute("javax.servlet.error.status_code",500);//这里只接受500状态错误 Map
map = new HashMap
(); map.put("code","data error"); map.put("msg",e.getMessage()); request.setAttribute("extra", map);//放在request中的数据,在前端页面中都可以取出来 return "forward:/error";//并不直接返回视图名称或json数据,请求转发到"/error",让Springboo按流程处理处理,从而达到自适应浏览器请求和客户端请求; }}//4-测试接口@Controllerpublic class DemoController { @GetMapping(value="test") public String toExceptionPage( ){ throw new DataException();//主动抛出一个500错误,用于测试 }}
//templates/error/5XX.html    
Title

自定义页面 --路径:templates/error/5XX.html页面 --优先级别:2

status:[[${status}]]

timestamp:[[${timestamp}]]

exception:[[${exception}]]

myName:[[${myName}]]

myAge:[[${myAge}]]

extra-code:[[${extra.code}]]

extra-msg:[[${extra.msg}]]

 4-2-demo示例

 

转载于:https://www.cnblogs.com/wobuchifanqie/p/10153848.html

你可能感兴趣的文章
C#中的Action<>和Func<>
查看>>
关于opencv中人脸识别主函数的部分注释详解。
查看>>
SQLServer内核架构剖析 (转载)
查看>>
Android 风格化的 Toggle Buttons
查看>>
Eclipse中SVN的安装步骤(两种)和用法
查看>>
安全运维之:网络实时流量监测工具iftop
查看>>
在 Windows上配置NativeScript CLI
查看>>
ubuntu14.04 qt4 C++开发环境搭建
查看>>
iOS 通讯录-获取联系人属性
查看>>
HTML5 文件域+FileReader 读取文件(一)
查看>>
有return的情况下try catch finally的执行顺序
查看>>
OSI七层模型具体解释
查看>>
9.中位数与顺序统计量
查看>>
第二章 知识图谱——机器大脑中的知识库
查看>>
Android 从清单配置文件元数据中获取值
查看>>
UML用例图
查看>>
Bitmap基本概念及在Android4.4系统上使用BitmapFactory的注意事项
查看>>
Objective-C:MRC(引用计数器)获得对象所有权的方式(init、retain、copy等)
查看>>
PowerShell 在线教程 4
查看>>
不要让你的未来,现在恨自己
查看>>