学习小片段——springboot 错误处理
一:先看看springboot默认的错误处理机制
springboot默认会判断是否是浏览器(http请求头Accept是否含有 text/html)来选择返回html错误页面或json错误信息


原因在于BasicErrorController 控制器中的这两个映射

errorHtml响应来自浏览器的请求,而error响应来自其他客户端的请求;
在errorHtml中最后两句,如果没有自定义的页面,就会使用系统默认的错误解析视图
二:那么如何定制自己的错误页面呢?
由BasicErrorController 控制器中errorHtml的最后调用
ModelAndView modelAndView = resolveErrorView(request, response, status, model);
获取用户自定义的对应的错误页面
(DefaultErrorViewResolver)

resolve方法或先查找模板引擎的页面中是否有error/(错误状态码) 页面,如果有就直接返回视图,如果没有就查找静态资源文件下有没有,如果也没有就返回null,使用springboot默认的
这样的话,我们就只需要在模板引擎解析目录或者静态资源目录的error文件夹下放入(错误状态码).html 即可,(也可以是4xx , 5xx)
模板页面里能获取到一些信息
timestamp:时间戳
status:状态码
error:错误提示
exception:异常对象
message:异常消息
errors:JSR303数据校验的错误都在这里
例如:(我是thymleaf)

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<!--/*@thymesVar id="status" type="java"*/-->
<title th:text="${status}"></title>
</head>
<body>
<h2>timestamp : [[${timestamp}]]</h2>
<h2>status : [[${status}]]</h2>
<h2>error : [[${error}]]</h2>
<h2>exception : [[${exception}]]</h2>
<h2>message : [[${message}]]</h2>
<h2>errors : [[${errors}]]</h2>
</body>
</html>

三:定制json格式错误响应
利用自定义异常处理机制来定制json数据响应
@ControllerAdvice
public class MyExceptionHandler {
@ResponseBody
@ExceptionHandler(Exception.class)
public Map<String, Object> exceptionHandler1(Exception e){
Map<String, Object> map = new HashMap<>();
map.put("status", 400);
map.put("msg", e.getMessage());
map.put("data", null);
return map;
}
}
@GetMapping("/222")
public void test4(){
throw new RuntimeException("23333");
}

四:需要像springboot默认的一样自动选择响应html页面还是json
html错误页面上的数据和json的数据都是通过errorAttributes.getErrorAttributes得到的,
所以我们可以在自定义异常处理中转发到/error, 并自定义ErrorAttributes,来实现
@ControllerAdvice
public class MyExceptionHandler {
@ExceptionHandler(Exception.class)
public String exceptionHandler1(Exception e, HttpServletRequest request){
Map<String, Object> map = new HashMap<>();
map.put("msg", e.getMessage());
map.put("data", null);
request.setAttribute("errorMap", map); request.setAttribute("javax.servlet.error.status_code",400); return "forward:/error";
}
}
@Component
public class MyErrorAttributes extends DefaultErrorAttributes {
@Override
public Map<String, Object> getErrorAttributes(RequestAttributes requestAttributes, boolean includeStackTrace) {
Map<String, Object> map = (Map<String, Object>) requestAttributes.getAttribute("errorMap", 0); return map;
}
}
还有之前的4xx.html
效果:


五:完全由我们自己实现
编写一个ErrorController的实现类【或者是编写AbstractErrorController的子类】,放在容器中,来达到自定义效果
学习小片段——springboot 错误处理的更多相关文章
- 学习小片段——thymeleaf入门
1: 概述 thymeleaf是一个跟 Velocity.FreeMarker 类似的模板引擎,和以前学的jsp相近,但性能上无疑是比jsp好. 参考文档官方文档:https://www.thymel ...
- WEB前端学习代码片段记录
1.JS设计模式片段 Function.prototype.addMethod = function (name,fn) { this.prototype[name] = fn; return thi ...
- 跟我一起,利用bitcms内容管理系统从0到1学习小程序开发:一、IIS下SSL环境搭建
缘起 1.从事互联网十来年了,一直想把自己的从事开发过程遇到的问题给写出来,分享给大家.可是可是这只是个种想法,想想之后就放下了,写出来的类文章是少之又少.古人说无志之人常立志,有志之人立长志.今天, ...
- mybatis学习笔记--常见的错误
原文来自:<mybatis学习笔记--常见的错误> 昨天刚学了下mybatis,用的是3.2.2的版本,在使用过程中遇到了些小问题,现总结如下,会不断更新. 1.没有在configurat ...
- Android学习小Demo(19)利用Loader来实时接收短信
之前写过一篇文章<Android学习小Demo(13)Android中关于ContentObserver的使用>,在里面利用ContentOberver去监測短信URI内容的变化.我们先来 ...
- SpringBoot系列五:SpringBoot错误处理(数据验证、处理错误页、全局异常)
声明:本文来源于MLDN培训视频的课堂笔记,写在这里只是为了方便查阅. 1.概念: SpringBoot 错误处理 2.具体内容 在之前的程序里面如果一旦出现了错误之后就会出现一堆的大白板,这个白板会 ...
- 实用的 CSS 小片段
看了 30 Seconds CSS,有了许多收获,所以写下了这篇文章,算是收藏一些代码小片段,留作后用. 一.手写 Loading 动画 (1)弹性加载动画 CSS 代码如下: .bounce-loa ...
- 源码学习系列之SpringBoot自动配置(篇一)
源码学习系列之SpringBoot自动配置源码学习(篇一) ok,本博客尝试跟一下Springboot的自动配置源码,做一下笔记记录,自动配置是Springboot的一个很关键的特性,也容易被忽略的属 ...
- 源码学习系列之SpringBoot自动配置(篇二)
源码学习系列之SpringBoot自动配置(篇二)之HttpEncodingAutoConfiguration 源码分析 继上一篇博客源码学习系列之SpringBoot自动配置(篇一)之后,本博客继续 ...
随机推荐
- Mysql报错[Warning] TIMESTAMP with implicit DEFAULT value is deprecated和Buffered warning: Changed limits
报错2019-04-24 12:06:46 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use -- ...
- Django web框架-----Django templates模板
说明:mytestsite是django框架下的项目,quicktool是mytestsite项目中的应用 一般的变量之类的用 {{ }}(变量),功能类的比如循环.条件判断是用 {% %}(标签) ...
- Android(五)——dex文件动态调试
代码动态调试: 代码动态调试技术,一般是通过观察程序在运行过程中的状态,如寄存器内容,函数执行结果,内存使用情况等等,分析函数功能,明确代码逻辑,查找可能存在的漏洞 工具:IDA 条件:Android ...
- 第八届 蓝桥杯 7、正则问题 dfs
描述:正则问题 考虑一种简单的正则表达式:只由 x ( ) | 组成的正则表达式.小明想求出这个正则表达式能接受的最长字符串的长度. 例如 ((xx|xxx)x|(x|xx))xx 能接受的最长字符串 ...
- Vue-devtools 安装浏览器调试
工欲善其事,必先利其器. 本文主要讲解Vue-devtools的安装和使用 安装方法有两个: 方法一:(前提条件需要FQ,省事省力省心方便快速) FQ =>谷歌商店 =>搜索 =>V ...
- sql语句进行写数据库时,字符串含有'的处理方式
如果字符串含有',sql语句在执行insert 或update时会发生错误,应将'替换成'',语句如下: land.Address = land.Address.Trim().Replace(&quo ...
- 小程序swiper 滑块视图容器
属性名 类型 默认值 说明 最低版本 indicator-dots Boolean false 是否显示面板指示点 indicator-color Color rgba(0, 0, 0, .3) 指示 ...
- day 10 函数命名空间、函数嵌套和作用域
1. day 09 内容复习 # 函数 # 可读性强 复用性强 # def 函数名(): # 函数体 #return 返回值 # 所有的函数 只定义不调用就一定不执行 #先定义后调用 #函数名() # ...
- CentOS 7系统上制作Clonezilla(再生龙)启动U盘并克隆双系统
笔记本安装的是双系统:Win7 64位,CentOS 7 64位. 政采就是个巨大的坑,笔记本标配的是5400转的机械硬盘,开机时间常常要一至两分钟,软件运行起来时各种数据的读写也非常慢,忍无可忍,决 ...
- Python P图
Python PIL PIL (Python Image Library) 库是Python 语言的一个第三方库,PIL库支持图像存储.显示和处理,能够处理几乎所有格式的图片. 一.PIL库简介 1. ...