小言_互联网的博客

Spring Boot 自定义错误响应

306人阅读  评论(0)

SpringBoot自定义错误响应

目录

SpringBoot自定义错误响应

1.默认错误响应

2.自定义响应页面

3.错误页面参数传递

3.1 默认参数

3.2 自定义参数传递

4.总结


1.默认错误响应


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

默认错误响应效果

 

响应的html源码如下


  
  1. <html>
  2.       <body>
  3.           <h1>Whitelabel Error Page </h1>
  4.           <p>This application has no explicit mapping for /error, so you are seeing this as a fallback. </p>
  5.           <div id='created'>Thu Feb 27 19:29:37 CST 2020 </div>
  6.           <div>There was an unexpected error (type=Bad Request, status=400). </div>
  7. <div>no user named xiaohong </div>
  8.       </body>
  9.   </html>
 

2.自定义响应页面


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

文件目录
 编辑4xx.html

  
  1. <!DOCTYPE html>
  2.   <html lang="en">
  3.   <head>
  4.       <meta charset="UTF-8">
  5.       <title>error </title>
  6.   </head>
  7.   <body>
  8.   <h1>亲,页面找不到了! </h1>
  9.  ​
  10.   </body>
  11.   </html>

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

自定义错误响应效果

 

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

3.错误页面参数传递


3.1 默认参数

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

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

重新编辑4xx.html


  
  1.   <!DOCTYPE html>
  2.   <html lang="en" xmlns:th="http://www.thymeleaf.org">
  3.   <head>
  4.       <meta charset="UTF-8">
  5.       <title>error </title>
  6.   </head>
  7.   <body>
  8.       <h1>亲,页面找不到了! </h1>
  9.   <h1>timestamp:[[${timestamp}]] </h1>
  10.   <h1>status:[[${status}]] </h1>
  11.   <h1>error:[[${error}]] </h1>
  12.   <h1>path:[[${path}]] </h1>
  13.   </body>
  14.   </html>

浏览器响应结果

使用默认参数的错误响应

 

3.2 自定义参数传递

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

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

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

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

代码如下

自定义测试Exception


  
  1. public class UserNotExists extends RuntimeException {
  2.       public UserNotExists() {
  3.           this( "no such user");
  4.     }
  5.  ​
  6.       public UserNotExists(String message) {
  7.           super(message);
  8.     }
  9.  }

编写异常控制器类


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

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


  
  1. @Component
  2.   public class MyExceptionHandler extends DefaultErrorAttributes {
  3.       @Override
  4.       public Map<String, Object> getErrorAttributes(WebRequest webRequest, boolean includeStackTrace) {
  5.          Map<String, Object> errorAttributes = super.getErrorAttributes(webRequest, includeStackTrace); //父类会返回系统默认的参数Map
  6.          Map<String,Object> extMap = (Map<String, Object>) webRequest.getAttribute( "extMap", 0); //0代表从request中取出参数
  7.  ​
  8.          Set<String> keySet = extMap.keySet();
  9.           //遍历传递过来的map,并将值加入到父类返回的参数map中
  10.           for (String s : keySet) {
  11.              errorAttributes.put(s,extMap.get(s));
  12.         }
  13.  ​
  14.           return errorAttributes;
  15.     }
  16.  }

重新编写4xx.html


  
  1.   <!DOCTYPE html>
  2.   <html lang="en" xmlns:th="http://www.thymeleaf.org">
  3.   <head>
  4.       <meta charset="UTF-8">
  5.       <title>error </title>
  6.   </head>
  7.   <body>
  8.   <h1>亲,页面找不到了! </h1>
  9.   <h1>timestamp:[[${timestamp}]] </h1>
  10.   <h1>status:[[${status}]] </h1>
  11.   <h1>error:[[${error}]] </h1>
  12.   <h1>path:[[${path}]] </h1>
  13.   <h1>code:[[${code}]] </h1> <!--自定义的参数code-->
  14.   <h1>myMessage:[[${myMessage}]] </h1> <!--自定义的参数 myMessage-->
  15.   </body>
  16.   </html>

浏览器响应结果

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

4.总结

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

(2)参考资料


转载:https://blog.csdn.net/qq_26192391/article/details/104543704
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场