1.错误演示

在SpringBoot项目中,项目出错会有默认的返回页面及返回数据,当使用浏览器访问时会跳转到错误页面

那么如果是其他设备访问会是啥呢,比如手机端,下面通过PostMan演示

可以看到返回的是JSON字符串,所以说SpirngBoot 对于错误处理还是比较好的。

对于错误处理的自动配置在spring-boot-autoconfigure-2.0.6.RELEASE.jar的org.springframework.boot.autoconfigure.web.servlet.error.ErrorMvcAutoConfiguration中有配置

2.错误自动配置原理

1.通过ErrorMvcAutoConfiguration给容器中添加了一下组件

DefaultErrorAttributes:页面共享错误信息(错误时间,错误状态码等),通过调用getErrorAttributes()方法获得错误信息

BasicErrorController:用来处理ErrorPageCustomizer发出的/error请求

在其方法中又通过两种方式返回不同的数据(这就是为啥通过浏览器请求返回html,通过其他客户端返回json)

那么为啥能区分浏览器或其他客户端呢?因为浏览器在请求头中设置了优先接收html数据

那么是如何响应页面和响应数据的呢 ?通过resolveErrorView(request, response, status, model)返回ModelAndView确定去那个页面,进入到resolveErrorView(request, response, status, model)方法中,查看解析代码

获得所有的ErrorViewResolver,而这个ErrorViewResolver就是下面的DefaultErrorViewResolver组件,去哪个页面就是由它来解析的的,通过DefaultErrorViewResolver组件得知

ErrorPageCustomizer:当系统出现错误时,通过getPath()获得到错误请求路径(/error),来到/error请求进行处理

DefaultErrorViewResolver:解析出现错误时返回到哪个页面

也可以将页面命名为4xx.html或5xx.html,这样以4或5开头的状态码 就会访问到对应页面

2.出现错误步骤,当错误状态码为4xx或5xx等错误时,ErrorPageCustomizer就会生效(定制错误响应规则),来到/error请求,就会被BasicErrorController处理

3.如何定制错误页面?如果有模板引擎的情况下,要想定制返回页面就可以在模板引擎下创建/error/错误状态码.html页面(将页面放在模板引擎的error文件夹下,命名为状态码.html),试想状态码很多,不能所有状态码都建一个页面,所以在DefaultErrorViewResolver中提供了将页面命名为4xx.html或5xx.html解决以4或5开头的状态码错误(提示:优先寻找精确状态码的页面),那么如果页面想要获得错误信息呢?通过组件一DefaultErrorAttributes的getErrorAttributes()可以获得错误信息,SpringBoot默认封状态model/body中,所以在页面上可以通过thymeleaf获取。如果没有模板引擎,默认去静态资源文件夹下找/error/状态码.html,但是没有模板引擎就不能获得错误信息。如果模板引擎文件夹及静态资源文件夹下都没有页面时,就来到SpringBoot默认的提示页面,通过spel表达式解析

4.如何定制错误的json数据?通过异常处理器返回json数据

import java.util.HashMap;
import java.util.Map;import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;@ControllerAdvice
public class MyExceptionHandler {@ExceptionHandler(MyException.class)//捕获自定义异常@ResponseBodypublic Map<String,Object> handlerException(Exception e) {//出现异常时会将异常传递过来Map<String,Object> map = new HashMap<String,Object>();map.put("code", "自定义状态码");map.put("msg", e.getMessage());return map;}
}

通过上面一种方法会没有自适应效果,即不管通过浏览器或是其他客户端访问返回的都是json数据,而我们想要通过浏览器访问返回页面,其他客户端访问返回json数据,我们把上面方法改为

@ExceptionHandler(MyException.class)public String handlerException(Exception e,HttpServletRequest request) {Map<String,Object> map = new HashMap<String,Object>();map.put("code", "自定义状态码");map.put("msg", e.getMessage());//设置错误状态码,一定要设置,否者就不会进入到自定义页面中request.setAttribute("javax.servlet.error.status_code", 404);//将自己的异常信息加入到requestrequest.setAttribute("extMap", map);//转发到/errorreturn "forward:/error";}

这里一定要加一个javax.servlet.error.status_code,否则无法解析自定义的页面,因为在解析页面时,通过geuStatus()从request中获得javax.servlet.error.status_code

上面已经说过,不管页面还是其它客户端返回的错误信息都是通过org.springframework.boot.autoconfigure.web.servlet.error.AbstractErrorController.getErrorAttributes(HttpServletRequest, boolean)方法返回的,在自定义json返回信息是,如果只是通过上面方式,在返回的json数据中是无法获得我们自定义的信息的,那么我们需要如何做呢?既然页面和json的错误信息都是通过getErrorAttributes(HttpServletRequest, boolean)获取,那么我们就写一个类继承DefaultErrorAttributes(上面提到的组件一),重写getErrorAttributes()方法就可以啦

import java.util.Map;import org.springframework.boot.web.servlet.error.DefaultErrorAttributes;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.WebRequest;@Component
public class MyErrorAttributes extends DefaultErrorAttributes {@Overridepublic Map<String, Object> getErrorAttributes(WebRequest webRequest, boolean includeStackTrace) {Map<String, Object> errorAttributes = super.getErrorAttributes(webRequest, includeStackTrace);Map<String, Object> map = (Map<String, Object>) webRequest.getAttribute("extMap", 0);//0标识从request中获取errorAttributes.put("tag", "标识");errorAttributes.put("extMap",map);return errorAttributes;//返回最终map}}

这样通过其他客户端访问返回的信息就有我们自己定义的错误信息了

SpringBoot错误处理原理及定制错误页面及错误数据相关推荐

  1. SpringBoot——错误处理机制 定制错误页面 (源码分析)

    目录 一.错误处理机制 二.ErrorPageCustomizer 三.BasicErrorController 四.DefaultErrorViewResolver 五.如何定制错误响应页面 六.D ...

  2. Spring Boot错误处理机制以及定制自己的错误页面

    在我们使用Spring Boot的过程中肯定有遇到过发生错误的时候,这个时候可能页面上出现的就是Spring Boot默认的错误界面,有的时候我们希望能显示我们自己设置的错误界面,或者携带我们自己的错 ...

  3. Spring boot定制错误页面

    定制错误页面 浏览器访问 如果,程序出错了 需要返回一个符合项目网站风格的页面 有模板引擎的情况下 error/状态码 将错误页面命名为,错误状态码.html 放在模板引擎文件夹里面的,error文件 ...

  4. Spring boot错误处理原理

    错误处理原理 ErrorMvcAutoConfiguration 错误处理自动配置 自动配置 给容器中添加了以下组件 1.DefaultErrorAttributes 2.BasicErrorCont ...

  5. Spring boot定制错误json数据

    定制错误json数据 客户端访问 如果,程序出错了 返回的json数据,需要定制的 定制错误页面 在模板文件夹.或者静态资源文件夹下 放置一个error文件夹,里面存放错误状态码对应的页面 这些页面, ...

  6. pyqt5程序发生错误不中断_关于Windows页面错误的一些基础概念

    很少被开发者关注的页面错误 今天我们会说说关于虚拟内存处理中最为常见的一个问题:页面错误(Page Fault). 什么情况下会发生一个页面错误呢? 当应用程序请求的页面地址不在当前的内存驻留页面(M ...

  7. react 错误边界_React with GraphQL和错误边界中的自定义错误页面

    react 错误边界 by Abi Noda 通过Abi Noda React with GraphQL和错误边界中的自定义错误页面 (Custom error pages in React with ...

  8. 404 网站服务器错误怎么解决,网站404错误页面是什么意思,它有什么用?

    在我们浏览网页时,时常会出现一些404页面,导致无法正常浏览网页,那么什么是404呢,为什么会产生404页面呢?下面我们一起来看看. 404介绍 404其实是一种http状态码,代表用户在浏览网页时, ...

  9. 404错误是找不到此页面吗,网站404页面如何设计?

    404错误是找不到此页面吗,网站404页面如何设计? 浏览网站时,有时会突然出现404错误页面,提示当前页面不存在.那么,什么情况会导致页面丢失,出现404错误页面呢? (1)网站改版 (2)域名更换 ...

  10. java 404页面_SpringBoot全局异常处理与定制404页面的方法

    一.错误处理原理分析 使用SpringBoot创建的web项目中,当我们请求的页面不存在(http状态码为404),或者器发生异常(http状态码一般为500)时,SpringBoot就会给我们返回错 ...

最新文章

  1. 1071 mysql_mysql 出现1071错误怎么办
  2. 《软件构架实践》7-9章读后感
  3. Attention-OCR(Attention-based Extraction of Structured Information from Street View Imagery)
  4. “2012年度IT博客大赛”获奖感言--梦想、学习、坚持、自信、淡定
  5. oracle asm和文件系统,Oracle工具之--ASM与文件系统及跨网络传输文件
  6. jQuery.Form.js 异步提交表单使用总结
  7. c语言编译器app官网下载,c语言编译器
  8. App后台开发运维和架构实践学习总结(9)——三种常见的API设计错误及解决方案
  9. 中值滤波器 ( Median Filter ) C++ 实现
  10. asp.net 实现动态显示当前时间(不用javascript不考虑开销)
  11. 将多张图片缩小合为一张图片(千图成像)
  12. python+selenium实现QQ空间的登录
  13. 苹果雪豹操作系统_苹果从英特尔转向ARM,可能意味着暂时不适合购买Mac
  14. Spark SQL的自定义函数UDF
  15. QEMU同步脏页原理
  16. 一个想成为码龙的码农
  17. layer 关闭一个弹窗打不开新的的弹窗_电脑小技巧关闭FF弹窗
  18. maven核心,pom.xml详解
  19. 34万奖金!第三届厦门国际银行数创金融杯金融营销大赛来啦!
  20. 国产开源数据库:腾讯云TBase在分布式HTAP领域的探索与实践

热门文章

  1. 自媒体平台批量文章采集
  2. 免校准的电量计量芯片_应物联网而生:合力为HLW8012系列免校准电能计量芯片-测试测量-与非网...
  3. 【非原创】python调用bartender操控打印机打印条码
  4. 个人业务网站php源码,最新个人发卡网源码,PHP运营级个人自动发卡平台完整源码...
  5. usb转4路rs485、4路rs232原理图
  6. OBS视频录制及其直播推流教程(超详细,非硬核)
  7. Windows10桌面美化合集(壁纸+任务栏+资源管理器)
  8. 【Altium Designer10详细安装】
  9. JS对象转JSON转数组
  10. 配置交叉编译工具链和环境变量