一:先看看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 错误处理的更多相关文章

  1. 学习小片段——thymeleaf入门

    1: 概述 thymeleaf是一个跟 Velocity.FreeMarker 类似的模板引擎,和以前学的jsp相近,但性能上无疑是比jsp好. 参考文档官方文档:https://www.thymel ...

  2. WEB前端学习代码片段记录

    1.JS设计模式片段 Function.prototype.addMethod = function (name,fn) { this.prototype[name] = fn; return thi ...

  3. 跟我一起,利用bitcms内容管理系统从0到1学习小程序开发:一、IIS下SSL环境搭建

    缘起 1.从事互联网十来年了,一直想把自己的从事开发过程遇到的问题给写出来,分享给大家.可是可是这只是个种想法,想想之后就放下了,写出来的类文章是少之又少.古人说无志之人常立志,有志之人立长志.今天, ...

  4. mybatis学习笔记--常见的错误

    原文来自:<mybatis学习笔记--常见的错误> 昨天刚学了下mybatis,用的是3.2.2的版本,在使用过程中遇到了些小问题,现总结如下,会不断更新. 1.没有在configurat ...

  5. Android学习小Demo(19)利用Loader来实时接收短信

    之前写过一篇文章<Android学习小Demo(13)Android中关于ContentObserver的使用>,在里面利用ContentOberver去监測短信URI内容的变化.我们先来 ...

  6. SpringBoot系列五:SpringBoot错误处理(数据验证、处理错误页、全局异常)

    声明:本文来源于MLDN培训视频的课堂笔记,写在这里只是为了方便查阅. 1.概念: SpringBoot 错误处理 2.具体内容 在之前的程序里面如果一旦出现了错误之后就会出现一堆的大白板,这个白板会 ...

  7. 实用的 CSS 小片段

    看了 30 Seconds CSS,有了许多收获,所以写下了这篇文章,算是收藏一些代码小片段,留作后用. 一.手写 Loading 动画 (1)弹性加载动画 CSS 代码如下: .bounce-loa ...

  8. 源码学习系列之SpringBoot自动配置(篇一)

    源码学习系列之SpringBoot自动配置源码学习(篇一) ok,本博客尝试跟一下Springboot的自动配置源码,做一下笔记记录,自动配置是Springboot的一个很关键的特性,也容易被忽略的属 ...

  9. 源码学习系列之SpringBoot自动配置(篇二)

    源码学习系列之SpringBoot自动配置(篇二)之HttpEncodingAutoConfiguration 源码分析 继上一篇博客源码学习系列之SpringBoot自动配置(篇一)之后,本博客继续 ...

随机推荐

  1. Vue非父子级通信

    <div id="app"> <xz-todo></xz-todo> </div> <!--1. 为每个组件定义HTML 模板 ...

  2. ArcGIS制作tpk离线压缩包

    ArcGIS制作tpk离线压缩包 tpk是什么的缩写,对应的中文名称是? 什么叫tpk文件? 缓存切片? 切片类型:紧凑型与稀疏型.   一.目前自己使用的在ArcMap中制作tpk压缩包 1.首先打 ...

  3. leetcode-979-树

    https://leetcode.com/problems/distribute-coins-in-binary-tree/ n个硬币随机分布在n个点上,要求每个点都拥有一个硬币,问最小的花费. 对每 ...

  4. 关于人人网的form查找和打印

    from lianxi import sessionimport json# urlurl = 'http://www.renren.com/ajaxLogin/login?1=1&uniqu ...

  5. Linux c codeblock的使用(四):创建自己的静态函数库

    从我之前的博文当中,大家应该大概了解了linux下的函数库究竟是一个什么样的东西.linux下的函数库其实就像windows中的dll文件,里面包含了程序运行所需要的函数. 其实无论是我们使用linu ...

  6. React 的坑

    MemoryRouter 会缓存组件,导致有时候 componentDidMount 不会执行

  7. FlatList 核心运用

    <FlatList data={this.state.stuList} renderItem={this._renderItem} keyExtactor={this._keyExtractor ...

  8. python学习小总结(列表、元组、字典、集合、字符串)

    ---恢复内容开始--- 一.列表(list) 1.添加 append():追加,在列表末尾添加元素. 列表名.append(添加的元素) extend():扩展,在列表末尾添加元素. 列表名.ext ...

  9. Selenium自动化获取Http报文信息并判断当前API状态

    public int loadingFinishedCount(WebDriver driver){ LogEntries logs = driver.manage().logs().get(&quo ...

  10. 关于C#mvc用iis发布,虚拟目录的问题。

    mvc关于iis发布虚拟目录的问题,解决方法是修改代码中路径的方式,例如ajax中常用的为url:“/Home/Index”,可修改为 url: '@Url.Action("Index&qu ...