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-3-demo示例

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

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

2-自定义错误的json

2-1-源码分析

  1. //1-自定义Exception
  2. public class DataException extends RuntimeException {
  3.  
  4. public DataException() {
  5. super("数据不存在!");
  6. }
  7. }
  8.  
  9. //2-自定义handleException方法
  10. @ControllerAdvice
  11. public class MyExceptionHandler {
  12.  
  13. @ResponseBody
  14. @ExceptionHandler(DataException.class)
  15. public Map<String,Object> handleException(Exception e){
  16.  
  17. Map<String,Object> map = new HashMap<String,Object>();
  18. map.put("code","data error");
  19. map.put("msg",e.getMessage());
  20.  
  21. return map;
  22.  
  23. }
  24. }
  25.  
  26. //3-测试接口
  27. @Controller
  28. public class DemoController {
  29.  
  30. @GetMapping(value="test")
  31. public String toExceptionPage( ){
  32. throw new DataException();
  33. }
  34. }

2-2-页面效果

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

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

3-1-源码示例

  1. //1-自定义Exception
  2. public class DataException extends RuntimeException {
  3.  
  4. public DataException() {
  5. super("数据不存在!");
  6. }
  7. }
  8.  
  9. //2-自定义handleException方法
  10. @ControllerAdvice
  11. public class MyExceptionHandler {
  12.  
  13. @ExceptionHandler(DataException.class)
  14. public String handleException(Exception e, HttpServletRequest request){
  15. //传入我们自己的错误状态码 4xx 5xx,否则就不会进入定制错误页面的解析流程
  16. request.setAttribute("javax.servlet.error.status_code",500);
  17. Map<String,Object> map = new HashMap<String,Object>();
  18. map.put("code","data error");
  19. map.put("msg",e.getMessage());
  20.  
  21. return "forward:/error";
  22.  
  23. }
  24. }
  25.  
  26. //3-测试接口
  27. @Controller
  28. public class DemoController {
  29.  
  30. @GetMapping(value="test")
  31. public String toExceptionPage( ){
  32. throw new DataException();
  33. }
  34. }

3-2-demo示例

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

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

4-1-源码解析

  1. //1-自定义ErrorAttributes
  2. @Component
  3. public class MyErrorAttributes extends DefaultErrorAttributes {
  4.  
  5.   //重写getErrorAttributes方法-添加自己的项目数据
  6. public Map<String, Object> getErrorAttributes(WebRequest webRequest, boolean includeStackTrace) {
  7. Map<String, Object> errorAttributes = super.getErrorAttributes(webRequest,includeStackTrace);
  8.  
  9. errorAttributes.put("myName","我不吃番茄");//自定义数据
  10. errorAttributes.put("myAge","不告诉你");//自定义数据
  11.  
  12. return errorAttributes;
  13. }
  14. }
  15.  
  16. //2-自定义Exception
  17. public class DataException extends RuntimeException {
  18.  
  19. public DataException() {
  20. super("数据不存在!");
  21. }
  22. }
  23.  
  24. //3-自定义handleException方法
  25. @ControllerAdvice
  26. public class MyExceptionHandler {
  27.  
  28. @ExceptionHandler(DataException.class)
  29. public String handleException(Exception e, HttpServletRequest request){
  30. //传入我们自己的错误状态码 4xx 5xx,否则就不会进入定制错误页面的解析流程
  31. request.setAttribute("javax.servlet.error.status_code",500);//这里只接受500状态错误
  32. Map<String,Object> map = new HashMap<String,Object>();
  33. map.put("code","data error");
  34. map.put("msg",e.getMessage());
  35. request.setAttribute("extra", map);//放在request中的数据,在前端页面中都可以取出来
  36. return "forward:/error";//并不直接返回视图名称或json数据,请求转发到"/error",让Springboo按流程处理处理,从而达到自适应浏览器请求和客户端请求;
  37.  
  38. }
  39. }
  40.  
  41. //4-测试接口
  42. @Controller
  43. public class DemoController {
  44.  
  45. @GetMapping(value="test")
  46. public String toExceptionPage( ){
  47. throw new DataException();//主动抛出一个500错误,用于测试
  48. }
  49. }
  1. //templates/error/5XX.html
  2.  
  3. <!DOCTYPE html>
  4. <html lang="en">
  5. <head>
  6. <meta charset="UTF-8">
  7. <title>Title</title>
  8. </head>
  9. <body>
  10. <h1>自定义页面 --路径:templates/error/5XX.html页面 --优先级别:2</h1>
  11. <h1>status:[[${status}]]</h1>
  12. <h2>timestamp:[[${timestamp}]]</h2>
  13. <h2>exception:[[${exception}]]</h2>
  14. <h2>myName:[[${myName}]]</h2>
  15. <h2>myAge:[[${myAge}]]</h2>
  16. <h2>extra-code:[[${extra.code}]]</h2>
  17. <h2>extra-msg:[[${extra.msg}]]</h2>
  18. </body>
  19. </html>

4-2-demo示例

Springboot学习05-自定义错误页面完整分析的更多相关文章

  1. Springboot学习04-默认错误页面加载机制源码分析

    Springboot学习04-默认错误页面加载机制源码分析 前沿 希望通过本文的学习,对错误页面的加载机制有这更神的理解 正文 1-Springboot错误页面展示 2-Springboot默认错误处 ...

  2. Springboot异常处理和自定义错误页面

    1.异常来源 要处理程序发生的异常,首先需要知道异常来自哪里? 1.前端错误的的请求路径,会使得程序发生4xx错误,最常见的就是404,Springboot默认当发生这种错误的请求路径,pc端响应的页 ...

  3. java web 自定义错误页面 完整jsp错误页面代码(同时写错误日志) error.jsp

    1.首先配置web.xml  添加一下代码 <error-page> <error-code>500</error-code> <location>/e ...

  4. SpringBoot自定义错误页面,SpringBoot 404、500错误提示页面

    SpringBoot自定义错误页面,SpringBoot 404.500错误提示页面 SpringBoot 4xx.html.5xx.html错误提示页面 ====================== ...

  5. springboot自定义错误页面

    springboot自定义错误页面 1.加入配置: @Bean public EmbeddedServletContainerCustomizer containerCustomizer() { re ...

  6. Springboot - 自定义错误页面

    Springboot 没找到页面或内部错误时,会访问默认错误页面.这节我们来自定义错误页面. 自定义错误页面 1.在resources 目录下面再建一个 resources 文件夹,里面建一个 err ...

  7. ASP.NET全局错误处理和异常日志记录以及IIS配置自定义错误页面

    应用场景和使用目的 很多时候,我们在访问页面的时候,由于程序异常.系统崩溃会导致出现黄页.在通常的情况下,黄页对于我们来说,帮助是极大的,因为它可以帮助我们知道问题根源,甚至是哪一行代码出现了错误.但 ...

  8. Spring Boot自定义错误页面,Whitelabel Error Page处理方式

    我已经是Spring Framework框架的忠实粉丝.对于企业软件开发者来说它提供了对常见问题的通用解决方案,包括那些你在未来开发中没有意识到的问题.但是,它构建的J2EE项目变得比较臃肿,需要被一 ...

  9. ASP.NET自定义错误页面

    ASP.NET自定义错误页面 ASP.NET 提供三种用于在出现错误时捕获和响应错误的主要方法:Page_Error 事件.Application_Error 事件以及应用程序配置文件 (Web.co ...

随机推荐

  1. ajax 调用webservice 跨域问题

    注意两点 1. 在webservice的config中加入这段位置 (注意不是调用webservice的webconfig中加入) <system.webServer>     <! ...

  2. Java中的接口和抽象类

    接口和抽象类是Java设计中最基本的概念,它们都不能实例化对象,都可以实现多态,也都能用来创建匿名内部类.但实际使用上还有很多的不同. 两者的语法定义不同,对应的设计抽象关系也不同,接口主要是对行为的 ...

  3. Spring Web常见面试问题

    一.Web容器初始化过程 先初始化listener,然后是filter,然后是servlet. 二.Spring MVC项目中IOC容器关系 Web容器启动时通知ContextLoaderListen ...

  4. ILBC 规范 2

    接上篇 <ILBC 规范>  https://www.cnblogs.com/KSongKing/p/10354824.html  , ILBC    的 目标 是    跨平台  跨设备 ...

  5. 【转】Entity Framework 复杂类型

    为了说明什么是复杂属性,先举一个例子. public class CompanyAddress { public int ID { get; set; } public string CompanyN ...

  6. C风格字符串和C++string对象的相互转化

    一.C风格的字符串转化为C++的string对象 C++中,string 类能够自动将C 风格的字符串转换成string 对象   #include <iostream> #include ...

  7. 云存储的未来:Scale Up还是Scale Out?

      云存储的几十年发展历程,其计算架构模型,也从Scale Up走向Scale Out.但是展望未来数字世界的海量需求,目前流行的模型还能够持续满足吗?本文通过对云存储历史的回顾,及对Scale Up ...

  8. I18nUtils

    import java.io.File; import java.io.FileInputStream; import java.io.InputStream; import java.util.*; ...

  9. centos7将可执行程序做成服务

    1.systemctl 用法:systemctl [OPT] COMMAND [NAME]…启动服务:systemctl start NAME.service停止服务:systemctl stop N ...

  10. Vue 封装js 并 引用

    /封装模块化文件 新建的.js文件 var storage = { set(key, value) { localStorage.setItem(key, JSON.stringify(value)) ...