5分钟带你快速掌握Spring Boot 自定义错误响应页面
发布日期:2021-06-29 15:51:45 浏览次数:2 分类:技术文章

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

SpringBoot自定义错误响应

目录


1.默认错误响应


使用SpringBoot默认错误响应效果如下:

默认错误响应效果

 

响应的html源码如下

              

Whitelabel Error Page

         

This application has no explicit mapping for /error, so you are seeing this as a fallback.

         
Thu Feb 27 19:29:37 CST 2020
         
There was an unexpected error (type=Bad Request, status=400).
no user named xiaohong
      
 

2.自定义响应页面


在模板引擎目录下新建文件error/4xx.html

文件目录
 编辑4xx.html
       
     error   

亲,页面找不到了!

 ​  

在浏览器中访问一个错误地址,效果如下

自定义错误响应效果

 

说明:可以为不同响应码建立对应的html文件,命名方式为响应码.html,例如400.html,404.html,没有这些则找4xx.html

3.错误页面参数传递


3.1 默认参数

SpringBoot 默认可以获取的参数有以下几个

 timestamp:时间戳 status:状态码 error:错误提示 exception:异常对象 message:异常消息 errors:JSR303数据校验的错误都在这里

重新编辑4xx.html

        
     error       

亲,页面找不到了!

 

timestamp:[[${timestamp}]]

 

status:[[${status}]]

 

error:[[${error}]]

 

path:[[${path}]]

  

浏览器响应结果

使用默认参数的错误响应

 

3.2 自定义参数传递

有时候我们需要向错误页面传递一些自定义参数,这种情况下需要进行以下几个步骤

  1. 编写异常控制器类,并传递参数

  2. 继承DefaultErrorAttributes类,复写getErrorAttributes()方法

  3. 在响应页面中使用参数

代码如下

自定义测试Exception

public class UserNotExists extends RuntimeException {     public UserNotExists() {         this("no such user");     } ​     public UserNotExists(String message) {         super(message);     } }

编写异常控制器类

 @ControllerAdvice public class MyErrorController { ​     @ExceptionHandler(UserNotExists.class)//传入需要处理的异常类     public String handlerUserNotException(Exception e, HttpServletRequest request){         Map
map=new HashMap<>();         map.put("code","UserNotExists");         map.put("myMessage",e.getMessage());         request.setAttribute("extMap",map);//将传递的参数加入到request中         request.setAttribute("javax.servlet.error.status_code",400);//这里一定要设置响应码,要不然会走向错误的处理流程         return "forward:/error";    } }

继承DefaultErrorAttributes类,复写getErrorAttributes()方法

@Component public class MyExceptionHandler extends DefaultErrorAttributes {     @Override     public Map
getErrorAttributes(WebRequest webRequest, boolean includeStackTrace) {         Map
errorAttributes = super.getErrorAttributes(webRequest, includeStackTrace);//父类会返回系统默认的参数Map         Map
extMap = (Map
) webRequest.getAttribute("extMap", 0);//0代表从request中取出参数 ​         Set
keySet = extMap.keySet();         //遍历传递过来的map,并将值加入到父类返回的参数map中         for (String s : keySet) {             errorAttributes.put(s,extMap.get(s));        } ​         return errorAttributes;    } }

重新编写4xx.html

        
     error   

亲,页面找不到了!

 

timestamp:[[${timestamp}]]

 

status:[[${status}]]

 

error:[[${error}]]

 

path:[[${path}]]

 

code:[[${code}]]

 

myMessage:[[${myMessage}]]

  

浏览器响应结果

使用了自定义参数的错误响应

4.总结

(1)使用上面这种方式可以利用SpringBoot为不同客户端请求发送不同类型数据的特性。例如:浏览器请求发送html页面,其他客户端发送json数据;

(2)参考资料

  • 尚硅谷官方视频教程
  • B站链接:  

转载地址:https://console.blog.csdn.net/article/details/104543704 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:Bootstrap中table的用法
下一篇:2. 两数相加_CodingPark编程公园

发表评论

最新留言

能坚持,总会有不一样的收获!
[***.219.124.196]2024年04月21日 03时05分54秒