springboot异常错误处理
1.在有模板引擎的情况下:
springboot会默认找 templates/error/错误状态码.html,所以我们要定制化错误页面就可以到templates/error下创建一个【对应错误状态码.html】html文件,当发生此状态码的错误springboot就会来到对应的页面。
同时如果我们想让400-499之间的错误都去同一个错误页面,那我们可以在templates/error下创建一个4xx.html。同理500-599的错误可以用5xx.html。
注意:springboot会优先匹配具体的【错误状态码.html】,然后再匹配4xx,5xx的。例如:发生了404错误,springboot优先到templates/error下找404.html,如果没有404.html,再找有没有4xx.html,有的话就会使用4xx.html。
在错误页面我们能够获取到的信息:
- timestamp:时间戳
- status:状态码
- error:错误提示
- exception:异常对象 springboot2.1.6在页面获取异常对象要现在全局配置文件中加入:server.error.include-exception=true
- message:异常消息
- errors:JSR数据校验的错误
2.在没有模板引擎(模板引擎找不到这个错误页面)的情况下,springboot会到静态资源文件夹下的error包下找。
3.以上都没有找到错误页面,就默认用springboot默认的错误提示页面
二、错误异常处理——自定义响应json数据
上边的错误处理中,如果是浏览器访问可以响应我们自己定制的错误页面,但是如果是其他客户端访问,则只会响应固定的json数据,如下图所示:
下边讲解三个异常处理返回自定义json数据的方式
首先编写一个自定义异常类
public class UserNotExitException extends RuntimeException {
public UserNotExitException() {
super("用户不存在");
}
}
方式一:
在异常处理器类中,通过map封装我们自己的json数据,然后将map返回。
@ControllerAdvice
public class MyExceptionHandler { @ResponseBody
@ExceptionHandler(UserNotExitException.class)
public Map<String,Object> userNotExitExceptionHandler(Exception e){
Map<String,Object> map = new HashMap<>();
map.put("code","user.notexit");
map.put("message",e.getMessage());
return map;
}
}
@ControllerAdvice:表明这是一个全局异常处理类
@ExceptionHandler(UserNotExitException.class):表明标注的此方法用于处理UserNotExitException异常。
@ResponseBody:将返回结果封装为json
3.结果
不管浏览器还是其他客户端发生该异常都统一得到下图的响应
方式二:转发到/error,进行自适应响应效果处理
@ControllerAdvice
public class MyExceptionHandler {
@ExceptionHandler(UserNotExitException.class)
public String userNotExitExceptionHandler(Exception e, HttpServletRequest request){
Map<String,Object> map = new HashMap<>();
request.setAttribute("javax.servlet.error.status_code",500);
map.put("code","user.notexit");
map.put("message","用户出错了");
return "forward:/error";
}
}
将响应转发到 /error,让springboot帮我们生成自适应效果。但是必须注意,一定要设置错误状态码(如代码中标黄色的那一句代码)。不设置的话springboot就不会进入定制错误页面的解析流程。设置了之后springboot就会到 templates/error/错误状态码.html页面处理。
注意:此方式浏览器访问发生错误不再响应的是json数据了,而是对于的错误响应网页。
其他客户端访问响应的是json数据,但是响应的json数据中没有我们map中put的数据。
方式三:通过DefaultErrorAttribute
1.在异常处理器类中将响应的json数据封装到map中,然后再将map放到请求域中
@ControllerAdvice
public class MyExceptionHandler {
@ExceptionHandler(UserNotExitException.class)
public String userNotExitExceptionHandler(Exception e, HttpServletRequest request){
Map<String,Object> map = new HashMap<>();
request.setAttribute("javax.servlet.error.status_code",500);
map.put("code","user.notexit");
map.put("message","用户出错了");
request.setAttribute("ext",map);
return "forward:/error";
}
}
2.编写错误属性类:新建一个类继承DefaultErrorAttribute类,并重写其中的getErrorAttributes方法
1 @Component
2 public class MyErrorAttributes extends DefaultErrorAttributes {
3 @Override
4 public Map<String, Object> getErrorAttributes(WebRequest webRequest, boolean includeStackTrace) {
5 Map<String, Object> map = super.getErrorAttributes(webRequest, includeStackTrace);
6 map.put("company","atguigu");
7 Map<String, Object> ext = (Map<String, Object>) webRequest.getAttribute("ext", 0);
8 map.put("ext",ext);
9 return map;
10 }
11 }
注意:
(1).必须将错误属性类添加到spring容器中。
(2).第7行标黄那段代码的作用是获取异常处理类中的map。其中最后的参数0,是从request域中取出数据“ext”。若要从session域中取数据,则将该参数设置为1.(0是从request域获取数据,1是从session域中获取数据)
(3).错误属性类中返回的map中的所有内容,页面都可以获取到。
总结:
此方式最好,当浏览器访问发生错误时,会响应对应的错误响应页面,当其他客户端访问发生错误时也会响应我们定制的json数据。
浏览器响应:
其他客户端响应:
springboot异常错误处理的更多相关文章
- SpringBoot自定义错误信息,SpringBoot适配Ajax请求
SpringBoot自定义错误信息,SpringBoot自定义异常处理类, SpringBoot异常结果处理适配页面及Ajax请求, SpringBoot适配Ajax请求 ============== ...
- springBoot异常统一处理
springBoot异常统一处理 采用@ControllerAdvice注解和@ExceptionHandler注解,可以对异常进行统一处理. 1.结构图: 2.pom.xml文件: <?xml ...
- 出现java.lang.NoClassDefFoundError: com/google/common/base/Charsets异常错误
使用selenium,出现java.lang.NoClassDefFoundError: com/google/common/base/Charsets异常错误 原因:selenium-server- ...
- 总结Selenium自动化测试方法(六)常见的异常错误处理
六.常见的异常错误处理 NoSuchElementException: Message: Unable to locate element: {"method":"xpa ...
- [转]ORACLE 异常错误处理
本文转自:http://www.cnblogs.com/soundcode/archive/2012/01/10/2318385.html 本篇主要内容如下: 5.1 异常处理概念 5.1.1 预定义 ...
- Java异常错误的面试题及答案
1) Java中什么是Exception? 这个问题经常在第一次问有关异常的时候或者是面试菜鸟的时候问.我从来没见过面高级或者资深工程师的 时候有人问这玩意,但是对于菜鸟,是很愿意问这个的.简单来说, ...
- 总结:整理 oracle异常错误处理 .
5.1 异常处理概念 5.1.1 预定义的异常处理 5.1.2 非预定义的异常处理 5.1.3 用户自定义的异常处理 5.1.4 用户定义的异常处理 5.2 异常错误传播 5.2.1 在执行部分引发 ...
- [推荐]ORACLE PL/SQL编程之五:异常错误处理(知已知彼、百战不殆)
原文:[推荐]ORACLE PL/SQL编程之五:异常错误处理(知已知彼.百战不殆) [推荐]ORACLE PL/SQL编程之五: 异常错误处理(知已知彼.百战不殆) 继上三篇:ORACLE PL/S ...
- 解决Python2.7的UnicodeEncodeError:'ascii' codec can't encode characters in position 0-78: ordinal not in range(128)异常错误
解决Python2.7的UnicodeEncodeError: 'ascii' codec can't encode异常错误 大家都知道,在使用python进行网络爬虫时,最头疼的就是转码问题,下面是 ...
随机推荐
- Tomcat漏洞集合
目录 Tomcat的几大高危漏洞 Tomcat安全措施 Tomcat的几大高危漏洞 1.Tomcat后台弱口令上传war包(Tomcat管理弱口令页面Getshell) 2.Tomcat的PUT的上传 ...
- 《前端运维》一、Linux基础--基础命令(1)
在开始之前,你需要做一些准备工作,去阿里买一台服务器,服务器的具体细节其实并不是十分重要,我也不会在这里一步一步的教大家如何去买一个服务器.百度一下足够了,但是还是要贴一下这篇文章中,我所使用的服务器 ...
- seccomp沙盒逃逸基础——沙盒的规则编写
seccomp沙盒逃逸基础--沙盒的规则编写 引入: 安全计算模式 seccomp(Secure Computing Mode)是自 Linux 2.6.10 之后引入到 kernel 的特性.一切都 ...
- 死磕Spring之AOP篇 - Spring 事务详解
该系列文章是本人在学习 Spring 的过程中总结下来的,里面涉及到相关源码,可能对读者不太友好,请结合我的源码注释 Spring 源码分析 GitHub 地址 进行阅读. Spring 版本:5.1 ...
- Hbase问题小结(一)
1. Hbase读写优化 写: 批量写.异步批量提交.多线程并发写.使用BulkLoad写入.表优化(压缩算法.预分区.合理的rowkey设计.合理关闭WAL或异步WAL) SKIP_WAL:只写缓存 ...
- 浅尝js垃圾回收机制
局部作用域内的变量,在函数执行结束之后就会被js的垃圾回收机制销毁 为什么要销毁局部变量? => 为了释放内存 js垃圾回收机制何时会销毁局部变量 : 如果局部变量无法再得到访问,就会被 ...
- Exception in thread "main" java.lang.NoClassDefFoundError: com/google/common/collect/ImmutableMap
selenium + java + mac + idea 报错分析: 网上搜的教程,配置selenium 自动化测试环境,都是只让导入 client-combined-3.141.59-sources ...
- Java关键字(八)——synchronized
synchronized 这个关键字,我相信对于并发编程有一定了解的人,一定会特别熟悉,对于一些可能在多线程环境下可能会有并发问题的代码,或者方法,直接加上synchronized,问题就搞定了. 但 ...
- APP专项测试实战1
首先,如果测试需要用到的话,还是建议一下大家去看下Android-studio的官方文档.文档地址:Documentation | Android 开发者 | Android Develope ...
- [C] gcc
概述 GNU C Compiler 流程 预处理,生成.i文件(中间文件,看不到) 编译,生成.s文件(中间文件,看不到) 汇编,生成.o文件 链接,生成可执行文件 参数 -E:预处理 -S:预处理, ...