学习小片段——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自动配置(篇一)之后,本博客继续 ...
随机推荐
- android ----- 分享的连接在手机上打开App
首先做成HTML的页面,页面内容格式如下: <a href="[scheme]://[host]/[path]?[query]">启动应用程序</a> 这一 ...
- vmware虚拟机安装vmware tools
为了在主机与虚拟机之间共享文件,需要安装vmware tools.在安装vmware tools的过程中遇到了几个坑,在此记录一下. 一.虚拟机关机情况下进行设置.虚拟机->设置->CD/ ...
- 初学Git命令
初始化一个Git仓库,使用git init命令. 添加文件到Git仓库,分两步: 使用命令git add <file>,注意,可反复多次使用,添加多个文件: 使用命令git commit ...
- mybatis逆向工程generatorConfiguration详细配置
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE generatorConfiguratio ...
- linux逻辑卷管理(LVM)
1. 逻辑卷(LVM)的原理 LVM(Logical Volume Manager)逻辑卷管理 是在物理磁盘和文件系统的之间添加一个逻辑层,通过对底层物理磁盘的封装,以逻辑卷的方式呈现给上层应用,通过 ...
- PAT 1116 Come on! Let's C
1116 Come on! Let's C (20 分) "Let's C" is a popular and fun programming contest hosted b ...
- thrift之php,python使用TServerSocket并发 处理请求
要求: 不适用nginx+fastcgi情况下,分布式系统之间如果通讯,如果不阻塞,能并发处理请求 环境: luman/laravel:5.5 php:7.2 thrift -version :Thr ...
- extern "C"的用法
文章转自开源电子论坛:http://www.openedv.com/forum.php?mod=viewthread&tid=7986 看一些程序的时候老是有 “#ifdef __cplusp ...
- 通信技术以及5G和AI保障电网安全与网络安全
摘 要:电网安全是电力的基础,随着智能电网的快速发展,越来越多的ICT信息通信技术被应用到电力网络.本文分析了历史上一些重大电网安全与网络安全事故,介绍了电网安全与网络安全.通信技术与电网安全的关系以 ...
- 进到页面后input输入框自动获取焦点
<html> <head></head> <body> 用户名:<input type="text" ...