SpringBoot之错误处理机制以及定制错误信息

VMware 安装 Windows11 一、下载win11的镜像文件 可以在MSDN网站下载: MSDN系统库-致力于原版windows生态服务 二、创建虚拟机 1.双击打开VMware虚拟机,点击创建新的虚拟机 2.选择典型(推荐),然后点击下一步 3.在安装程序光盘映像文件下,点击浏览按钮,选择Windows 11ISO镜像文件所在的路径,在Windows 11安装文件路径中不要有中文或其他特殊符号,否则有可能引起错误。然后点击下一步 4.在选择客户机操作系统界... 阅读详情

一、SpringBoot默认的错误处理机制

默认效果:

1)、浏览器,返回一个默认的错误页面
这里写图片描述
浏览器发送请求的请求头:

这里写图片描述
2)、如果是其他客户端,默认响应一个json数据
这里写图片描述
这里写图片描述

原理:

可以参照ErrorMvcAutoConfiguration:错误处理的自动配置

给容器中添加了以下组件

1、DefaultErrorAttributes:

// 帮我们在页面共享信息;
@Override
public Map<String, Object> getErrorAttributes(RequestAttributes requestAttributes,
        boolean includeStackTrace) {
    Map<String, Object> errorAttributes = new LinkedHashMap<String, Object>();
    errorAttributes.put("timestamp", new Date());
    addStatus(errorAttributes, requestAttributes);
    addErrorDetails(errorAttributes, requestAttributes, includeStackTrace);
    addPath(errorAttributes, requestAttributes);
    return errorAttributes;
}

2、BasicErrorController:处理默认/error请求

@Controller
@RequestMapping("${server.error.path:${error.path:/error}}")
public class BasicErrorController extends AbstractErrorController {

    @RequestMapping(produces = "text/html")//产生html类型的数据;浏览器发送的请求来到这个方法处理
    public ModelAndView errorHtml(HttpServletRequest request,
            HttpServletResponse response) {
        HttpStatus status = getStatus(request);
        Map<String, Object> model = Collections.unmodifiableMap(getErrorAttributes(
                request, isIncludeStackTrace(request, MediaType.TEXT_HTML)));
        response.setStatus(status.value());

        //去哪个页面作为错误页面;包含页面地址和页面内容
        ModelAndView modelAndView = resolveErrorView(request, response, status, model);
        return (modelAndView == null ? new ModelAndView("error", model) : modelAndView);
    }

    @RequestMapping
    @ResponseBody    //产生json数据,其他客户端来到这个方法处理;
    public ResponseEntity<Map<String, Object>> error(HttpServletRequest request) {
        Map<String, Object> body = getErrorAttributes(request,
                isIncludeStackTrace(request, MediaType.ALL));
        HttpStatus status = getStatus(request);
        return new ResponseEntity<Map<String, Object>>(body, status);
    }

3、ErrorPageCustomizer:

@Value("${error.path:/error}")
private String path = "/error";//系统出现错误以后来到error请求进行处理;(web.xml注册的错误页面规则)

4、DefaultErrorViewResolver:

@Override
public ModelAndView resolveErrorView(HttpServletRequest request, HttpStatus status,
        Map<String, Object> model) {
    ModelAndView modelAndView = resolve(String.valueOf(status), model);
    if (modelAndView == null && SERIES_VIEWS.containsKey(status.series())) {
        modelAndView = resolve(SERIES_VIEWS.get(status.series()), model);
    }
    return modelAndView;
}

private ModelAndView resolve(String viewName, Map<String, Object> model) {
    //默认SpringBoot可以去找到一个页面?  error/404
    String errorViewName = "error/" + viewName;

    //模板引擎可以解析这个页面地址就用模板引擎解析
    TemplateAvailabilityProvider provider = this.templateAvailabilityProviders
            .getProvider(errorViewName, this.applicationContext);
    if (provider != null) {
        //模板引擎可用的情况下返回到errorViewName指定的视图地址
        return new ModelAndView(errorViewName, model);
    }
    //模板引擎不可用,就在静态资源文件夹下找errorViewName对应的页面:error/404.html
    return resolveResource(errorViewName, model);
}

步骤:

一旦系统出现4xx或者5xx之类的错误;ErrorPageCustomizer就会生效(定制错误的响应规则),就会来到/error请求;被BasicErrorController处理。

1)响应页面,去哪个页面是由DefaultErrorViewResolver解析得到的

protected ModelAndView resolveErrorView(HttpServletRequest request,
    HttpServletResponse response, HttpStatus status, Map<String, Object> model) {
    //所有的ErrorViewResolver得到ModelAndView
    for (ErrorViewResolver resolver : this.errorViewResolvers) {
        ModelAndView modelAndView = resolver.resolveErrorView(request, status, model);
        if (modelAndView != null) {
           return modelAndView;
        }
     }
     return null;
}

二、定制错误响应(分为页面和json数据两种形式)

如何定制错误信息的页面

a、有模板引擎的情况下;error/状态码;【将错误页面命名为 错误状态码.html 放在模板引擎文件夹里面的error文件夹下】,发生此状态码的错误就会来到 对应的页面;

我们可以使用4xx和5xx作为错误页面的文件名来匹配这种类型的所有错误,精确优先(优先寻找精确的状态码.html);

页面能获取的信息:

    timestamp:时间戳

    status:状态码

    error:错误提示

    exception:异常对象

    message:异常消息

    errors:JSR303数据校验的错误都在这里

b、没有模板引擎(模板引擎找不到这个错误页面),静态资源文件夹下找;
这里写图片描述
c、以上都没有错误页面,就是默认来到SpringBoot默认的错误提示页面

如何定制错误的json数据

a、自定义异常处理&返回定制json数据(如果只是需要返回自定义错误的json格式数据,这种方式即可满足)

@ControllerAdvice   //这个注解是指这个类是处理其他controller抛出的异常
public class MyExceptionHandler {
    //这个注解是指当controller中抛出这个指定的异常类的时候,都会转到这个方法中来处理异常
    @ExceptionHandler(UserNotExistException.class)
    @ResponseBody  //将返回的对象转成json数据
    public Map<String,Object> handleException(Exception e){
        Map<String,Object> map = new HashMap<>();
        map.put("code","user.notexist");
        map.put("message",e.getMessage());
        return map;
    }
}
//没有自适应效果...

b、转发到/error进行自适应响应效果处理

@ExceptionHandler(UserNotExistException.class)
public String handleException(Exception e, HttpServletRequest request){
    Map<String, Object> map = new HashMap<>();
    //传入我们自己的错误状态码  4xx 5xx,否则就不会进入定制错误页面的解析流程
    /**
     * Integer statusCode = (Integer) request
         .getAttribute("javax.servlet.error.status_code");
     */
    request.setAttribute("javax.servlet.error.status_code",500);
    map.put("code", "user.notexist");
    map.put("message", e.getMessage());
    request.setAttribute("extMap", map);
    //转发到/error
    return "forward:/error";
}

c、将我们的定制数据携带出去;

出现错误以后,会来到/error请求,会被BasicErrorController处理,响应出去可以获取的数据是由getErrorAttributes得到的(是AbstractErrorController(ErrorController)规定的方法);

  1. 完全来编写一个ErrorController的实现类【或者是编写AbstractErrorController的子类】,放在容器中;
  2. 页面上能用的数据,或者是json返回能用的数据都是通过errorAttributes.getErrorAttributes得到;

容器中DefaultErrorAttributes.getErrorAttributes(),默认进行数据处理的。

自定义ErrorAttributes

//给容器中加入我们自己定义的ErrorAttributes
@Component
public class MyErrorAttributes extends DefaultErrorAttributes {

    @Override
    public Map<String, Object> getErrorAttributes(WebRequest webRequest, boolean includeStackTrace) {

        // 获取SpringBoot处理异常后的异常信息
        Map<String, Object> map = super.getErrorAttributes(webRequest, includeStackTrace);
        // 可以加入自定义信息
        map.put("author", "章鱼");
        // 还可以从request域中获取信息,0代表request,1代表session
        Map<String, Object> extMap = (Map<String, Object>) webRequest.getAttribute("extMap", 0);
        map.put("extMap", extMap);

        return map;
    }
}

最终的效果:响应是自适应的,可以通过定制ErrorAttributes改变需要返回的内容

浏览器访问,返回错误页面:

<h1>status:[[${status}]]</h1>
<h1>timestamp:[[${timestamp}]]</h1>
<h1>message:[[${message}]]</h1>
<h1>MyErrorAttributes中加入的author:[[${author}]]</h1>
<h1>UserNotExistException中加入的extMap.exceptionType:[[${extMap.exceptionType}]]</h1>

这里写图片描述
其他客户端访问,则返回json数据:
这里写图片描述

用易经智慧看懂人工智能:64卦中的科技密码--当古老智慧遇见未来科技 在人工智能狂飙突进的今天,我们总在追问:这些代码构建的智能究竟会带人类走向何方?或许答案早已藏在《周易》的六十四卦中——这本中华文明的“源代码”,正用一种跨越时空的语言,悄悄解释着最前沿的科技秘密。 阅读详情

相关推荐

用limma包进行多组差异表达分析

写在前面:最近在使用limma包进行差异表达分析,参考了网上许多教程都觉得说的云里雾里,很不清楚。经过我自己一段时间非常痛苦的钻研,弄明白了,解决了我的实际需求。于是决定将我的分析经验写下来,分享给需要的人。 首先加载前期预处理好的表达矩阵。(我的原始表达矩阵文件已附在文后,大家有需要可以下载实践) setwd("E://Rworkplace") data<-read.table...

weixin_40640700的博客 4万+

springboot错误处理原理

配置错误处理路径 @ConfigurationProperties( prefix = "server", ignoreUnknownFields = true ) public class ServerProperties implements EmbeddedServletContainerCustomizer, EnvironmentAware, Ordered { //错误配置参数 @NestedConfigurationProperty private Error

hello_IT_的博客 614

从零到一:YOLOv8在边缘设备上的轻量化部署实战

本文详细介绍了YOLOv8在边缘设备上的轻量化部署实战,涵盖模型优化、TensorRT加速、剪枝与知识蒸馏等关键技术。通过工业质检和智能门禁项目案例,展示了如何将YOLOv8高效部署到树莓派、Jetson Nano等资源受限设备,显著提升推理速度和降低内存占用。文章还提供了动态分辨率调整、多模型级联部署等实用技巧,助力开发者实现边缘AI应用的高效落地。

weixin_29040367的博客 379

Spring boot定制错误数据携带出去

定制错误数据 Spring boot出现错误以后,会来到/error请求 会被BasicErrorController处理,自适应返回 浏览器访问,返回页面 客户端访问,返回json getErrorAttributes 获取返回的响应数据 在AbstractErrorController中定义 BasicErrorController的父类 BasicErr...

天高任鸟飞 1023

全志D1s RISC-V开发板硬件设计与Linux启动全流程解析

RISC-V架构是当前国产嵌入式处理器演进的核心方向,其启动流程涵盖从BootROM、SPL到U-Boot及Linux内核的多级引导机制。理解该流程需掌握DDR初始化、设备树适配、电源时序控制等底层原理,技术价值在于构建可追溯、可调试、可量产的最小可行系统(MVS)。典型应用场景包括边缘AI推理终端、工业HMI和轻量级网关等对成本与开源性敏感的领域。本文以全志D1s平台为载体,深入剖析基于玄铁C906内核的RISC-V SoC在真实硬件上的启动验证、电源完整性设计与Linux全链路开源实践。

weixin_32306683的博客 356

安信可TB蓝牙模组系列 实战Ble Mesh智能照明系统搭建

本文详细介绍了如何使用安信可TB蓝牙模组系列搭建Ble Mesh智能照明系统。从硬件准备、固件烧录到手机APP组网全流程,提供了实战步骤和优化建议,特别适合智能家居开发者入门。Ble Mesh的自组网能力解决了蓝牙传输距离限制,实现全屋灯光智能控制。

weixin_30856725的博客 352

Springboot自定义异常处理

背景Springboot 默认把异常的处理集中到一个ModelAndView中了,但项目的实际过程中,这样做,并不能满足我们的要求。具体的自定义异常的处理,参看以下前提 Springboot 默认的application properties Spring Boot异常处理详解 具体实现如果仔细看完Spring boot的异常处理详解,并且研究过源码后,我觉得具体的实现可以不用看了。。。 重写定义

jonathan的专栏 2万+

Python爬虫实战:基于最新技术栈的政府招标采购数据抓取与分析

对于企业、研究人员和数据分析师来说,能够高效地获取这些数据意味着可以获得宝贵的商业洞察和市场先机。随着反爬技术的不断升级和网站结构的日益复杂,传统的爬虫方法已经难以满足需求。我们将采用Selenium、Playwright等现代浏览器自动化工具,结合Scrapy框架和异步请求库,构建一个能够应对各种反爬措施的强大爬虫系统。Playwright是微软开发的浏览器自动化工具,支持Chromium、WebKit和Firefox,比Selenium更快速、更稳定。

2201_76125261的博客 1311

SpringBoot默认的处理异常机制,默认错误页面是怎么产生的呢?

一、前言   在基于SpringBoot开发的过程中,经常遇见“Whitelabel Error Page”的错误页面,比如: 404错误: 500错误:   在实际开发中,不止上面的这两种情况,还有很多其他情况,这里不再一一列举,这些错误页面是如何产生的,是如果工作的呢?其实这就是SpringBoot提供的默认的异常处理机制。我们这一节就来学习SpringBoot默认的异常处理机制。 二、主要接口或类   在SpringBoot实现的异常处理逻辑中,有几个常用的接口或类,我们这里先简单了解一下: E

向心行者 1220

python发送邮件的时候出现 error (535, b‘5.7.3 Authentication unsuccessful‘) 解决方法

出现该Bug的原因主要是 账号密码无法登录,但原先使用该代码测试qq或者163的时候是可以通过的!问题在于各个公司邮件所处理的代码方式不一样

码农研究僧的博客 3503

多物理场光学仿真软件:COMSOL_(10).激光器与谐振腔仿真

定义Nd:YAG晶体的材料属性% 折射率% 吸收系数% 发射截面% 定义光泵浦源% 泵浦光波长% 泵浦光强度% 泵浦光方向% 定义全反射镜% 选择边界% 完美电导体边界条件% 定义部分反射镜% 选择边界% 反射率边界条件% 反射率通过 COMSOL 对激光器和光学谐振腔进行仿真,可以全面评估激光器的性能,包括输出功率、效率、稳定性和模式选择等。这些仿真结果为激光器的设计和优化提供了重要的参考依据。

kkchenjj的博客 1648

Springboot全局异常处理从配置文件中读取自定义异常信息

自定义异常的教程社区上有很多,今天抽空研究了一下把自定义的异常信息写到配置文件中,自我感觉这样便于使用与维护,下面简单分享一下 1,springboot常用的pom依赖就不列出来了,这里我加了一个依赖 <!-- commons组件读取配置文件相关依赖 --> <dependency> <groupId>commons-configuration...

Spirit_NKlaus的专栏 1440

Cesium 场景特效之【全球海洋】GL2兼容版

Cesium 场景特效之【全球海洋】GL2兼容版

喜欢钻研前端和分享技术 1277

SpringBoot 错误处理

一、错误信息的1、页面提示 2、返回json数据格式1、原理1、查询ErrorMvcAutoConfiguration这个类可以看见,有错误处理信息自动配置,如下组件①【ErrorPageCustomizer】②【BasicErrorController】那是怎么区分是json还HTML呢? 查询浏览器的请求头, 而使用Postman工具可以看见其他的客户端的请求,的不是html ③【Defaul...

cpongo55 583

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Spring boot 2.x 错误处理机制 与 定制错误页面

目录 默认错误处理机制 浏览器访问 APP 访问 区分原理 错误处理机制原理 DefaultErrorAttributes BasicErrorController DefaultErrorViewResolver 定制错误页面 templates 下 404. html 4xx. html 运行测试 静态资源目录 下 本文导读 本文承接《Web 项目 tiger...

蚩尤后裔-汪茂雄 1798

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

尚硅谷学习笔记---SpringBoot错误处理机制

错误处理原理&定制错误页面 默认情况下当系统中错误错误的时候,SpringBoot的会跳转到一个空白页面,并显示默认的错误信息 有些情况下需要自定义错误页面和错误提示信息,那么要定制错误页面首先需要了解SpringBoot是如何处理系统错误的. 在SpringBoot自动配置中有以下组件参与处理错误信息,以下代码之中 帮我们在页面共享信息; @Override public M...

青椒盖饭的博客 319

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

SpringBoot----错误处理机制原理37

1.SpringBoot有默认的错误处理机制 1.1浏览器的错误处理结果 1.2客户端的错误处理结果 2.错误处理的自动配置原理 2.1.查找SpringBoot中ErrorMvcAutoConfiguration.class这个配置类,这个配置类中有四个组件,这个四个组件共同决定了SpringBoot的错误处理机制 2.2.配置类中的四个组件ErrorPageCustomize...

weixin_39337047的博客 207

Springboot错误页面和错误信息定制

SpringBoot2.1.4错误处理机制 前面一片已经介绍了springboot错误处理的机制,其实从整个分析过程中我们已经大概知道如何定制了。 1、错误页面自定义 springboot有个默认的错误页面,但是开发时错误页面肯定是自己定义的。那该如何定义? 在DefaultErrorViewResolver类中有下面几个方法, private ModelAndView resolve(Strin...

风清云淡 5474

SpringBoot(六)——错误处理机制

这篇文章主要介绍了SpringBoot的错误处理机制源码,以及自定义错误响应页面的方法。

weixin_43691723的博客 545

SpringMvc错误处理

DispatchServlet的doDispatch方法 // Actually invoke the handler. mv = ha.handle(processedRequest, response, mappedHandler.getHandler()) springmvc对应的handlermapper是RequestMappingHandlerAdapter @Overrid...

mingtiandexia的专栏 1212

【SpringBoot】默认错误处理机制的源码大白话分析,以及自定义配置(遇坑)

前言 SpringBoot版本:v2.2.6.RELEASE 本博客,主要总结以下3个方面: 一、SpringBoot的错误页面和数据 二、有关类的介绍 三、源码追踪,默认处理机制的流程 四、自定义错误数据 本博客站在学习者的角度,以通俗的大白话、图文并茂地,将整个层次和思路清晰分明地呈现,相信如果耐心看完的同学,应该也会有不一样的收获。任何一个框架的源码都是一个庞大的体系,阅读源码,不须苛求理解代码的每个细节,而应该关注并理解主要(关键)代码的主体思路。最后,看完不妨点赞收藏?自己花了大半天

passerbyYSQ 574

Spring Boot(五)——错误处理机制

一、SpringBoot默认的错误处理机制 1.1原理 可以参照ErrorMvcAutoConfiguration错误处理的自动配置,给容器中添加了一下组件: @Bean @ConditionalOnMissingBean( value = {ErrorAttributes.class}, search = SearchStrategy...

毛毛雨的博客 568

SpringBoot错误处理机制

浅谈SpringBoot错误处理机制一. DefaultErrorAttributes二. BasicErrorController三. ErrorPageCustomizer四. DefaultErrorViewResolver五. 如何自定义错误响应页面5.1 如何定制错误页面5.2 如何定制返回的Json数据 SpringBoot错误处理的自动配置由ErrorMvcAutoConfiguration提供,所以我们从对此类的分析入手研究错误处理机制。 一. DefaultErrorAttributes

木讷的鱼 496

Spring Boot的错误处理机制

1、Spring Boot默认的错误处理机制 1)浏览器访问,返回一个默认的错误处理页面 2)如果是其他客户端访问,返回JSON格式的数据 3)原理   查看ErrorMvcAutoConfiguration类,发现添加了如下4个组件: 【1】ErrorPageCustomizer 【2】BasicErrorController 【3】DefaultErrorAttributes 【4】Def...

zmt0104的博客 344

[SpringBoot]全局异常处理

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33881050的博客 80

(26)实验 - 错误处理原理,定制错误数据

1 SpringBoot默认的错误处理机制 默认效果: (1) 浏览器,返回一个默认的错误页面 (2) 如果是其他客户端,默认响应一个json数据 有时候在写CRUD的时候,比如说访问一个不存在的地址。 (1)浏览器,返回一个默认的错误页面 报错 (2)如果是其他客户端,默认响应一个json数据 原理可以参照: ErrorMvcAutoConfiguration 2 如何定制错误响应 我们...

魚 353
上一篇: SpringBoot之RestfulCRUD
下一篇: CentOS7安装Docker
章 鱼
博客等级 码龄10年 203粉丝 105原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值