05.Spring Boot 之错误处理机制

SpringBoot第十六天 - Web异常处理 SpringBoot - Web异常处理 了解SpringBoot进行Web开发时的异常处理机制。 1. 异常处理机制 1.1 默认异常处理 默认情况下,SpringBoot提供/error映射处理所有的异常, 并在Servlet容器中注册为全局错误处理页面。 对于浏览器客户端,SpringBoot响应一个"Whitelabel"错误视图, 以HTML格式展示,其中包含错误,HTTP状态码和异常的详细信息,看起来像这样: Whitelabel Error Page This application has 阅读详情

1. SpringBoot 默认的错误处理机制

代码已经上传至 https://github.com/masteryourself-tutorial/tutorial-spring ,详见 tutorial-spring-boot-core/tutorial-spring-boot-errorhandler 工程

1.1 浏览器请求错误

浏览器错误页

浏览器发起的请求中,请求头是 text/html

浏览器请求头

1.2 postman 请求错误

Postman 错误页

postman 发起的请求中,请求头是 */*

Postman 请求头

1.3 错误处理原理

由于开启了自动装配,所以容器中导入了 ErrorMvcAutoConfiguration 组件,这个组件又向容器中添加了如下几个组件

1.3.1 DefaultErrorAttributes

处理参数信息

@Bean
@ConditionalOnMissingBean(value = ErrorAttributes.class,
		search = SearchStrategy.CURRENT)
public DefaultErrorAttributes errorAttributes() {
	return new DefaultErrorAttributes(
			this.serverProperties.getError().isIncludeException());
}
1.3.2 BasicErrorController

处理默认的 /error 请求,本质上就是一个 controller

@Bean
@ConditionalOnMissingBean(value = ErrorController.class,
		search = SearchStrategy.CURRENT)
public BasicErrorController basicErrorController(ErrorAttributes errorAttributes) {
	return new BasicErrorController(errorAttributes, this.serverProperties.getError(),
			this.errorViewResolvers);
}

处理 ${server.error.path:${error.path:/error} 路径的请求,默认是 /error

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

    ...

    // 处理 text/html 请求
	@RequestMapping(produces = MediaType.TEXT_HTML_VALUE)
	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) ? modelAndView : new ModelAndView("error", model);
	}

    // 产生 json 数据,其他客户端来到这个方法处理
	@RequestMapping
	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<>(body, status);
	}

    ...

}
1.3.3 ErrorPageCustomizer

系统出现错误以后来到 /error 请求进行处理

@Bean
public ErrorPageCustomizer errorPageCustomizer() {
	return new ErrorPageCustomizer(this.serverProperties, this.dispatcherServletPath);
}
1.3.4 DefaultErrorViewResolverConfiguration

主要是向容器中注入 DefaultErrorViewResolver 组件

@Configuration
static class DefaultErrorViewResolverConfiguration {

	...

	@Bean
	@ConditionalOnBean(DispatcherServlet.class)
	@ConditionalOnMissingBean
	public DefaultErrorViewResolver conventionErrorViewResolver() {
		return new DefaultErrorViewResolver(this.applicationContext,
				this.resourceProperties);
	}

}

DefaultErrorViewResolverConfiguration 这个类有如下两个方法,用来返回 ModelAndView 对象,供 BasicErrorController 调用

@Override
public ModelAndView resolveErrorView(HttpServletRequest request, HttpStatus status,
		Map<String, Object> model) {
	ModelAndView modelAndView = resolve(String.valueOf(status.value()), 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) {

    // 默认 Spring Boot 可以去找到一个页面 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);
}

2. 定制错误页面

2.1 有模板引擎的情况

Spring Boot 错误页面命名为 错误状态码.html,放在模板引擎文件夹里面的 error 文件夹下

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

页面能够获取的信息有(见 org.springframework.boot.web.servlet.error.DefaultErrorAttributes):

  • timestamp:时间戳

  • status:状态码

  • error:错误提示

  • exception:异常对象

  • message:异常消息

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

2.2 没有模板引擎的情况

将会在静态资源文件夹下找,查找原理同上

2.3 以上都没有

使用 Spring Boot 提供默认的错误页面,见 org.springframework.boot.autoconfigure.web.servlet.error.ErrorMvcAutoConfiguration.StaticView#render

3. 定制错误数据

3.1 @ControllerAdvice

没有自适应效果,浏览器请求也会响应 json 数据,不够优雅

@ControllerAdvice
public class MyExceptionHandler {

    @ResponseBody
    @ExceptionHandler(Exception.class)
    public Map<String, Object> handleException(Exception e) {
        Map<String, Object> map = new HashMap<>();
        map.put("code", "999999");
        map.put("message", e.getMessage());
        return map;
    }

}
3.2 转发到 /error

转发到 /error 进行自适应响应效果处理,因为 Spring Boot 提供的 /error 请求是自适应的

@ExceptionHandler(Exception.class)
public String handleException(Exception e, HttpServletRequest request) {
    request.setAttribute("javax.servlet.error.status_code", 500);
    request.setAttribute("author", "masteryourself");
    // 转发到 /error
    return "forward:/error";
}
3.3 定制错误数据

出现错误以后,会来到 /error 请求,会被 BasicErrorController 处理,响应出去可以获取的数据是由 getErrorAttributes() 得到的(是 AbstractErrorController规定的方法),所以我们有两种方法来解决这个问题

  • 完全来编写一个 ErrorController 的实现类(或者是编写 AbstractErrorController 的子类),放在容器中

  • 页面上能用的数据,或者是 json 返回能用的数据都是通过 errorAttributes.getErrorAttributes() 得到,那么就向容器中注入一个 DefaultErrorAttributes 组件

@Component
public class MyErrorAttributes extends DefaultErrorAttributes {

    @Override
    public Map<String, Object> getErrorAttributes(WebRequest webRequest, boolean includeStackTrace) {
        Map<String, Object> map = super.getErrorAttributes(webRequest, includeStackTrace);
        map.put("author", webRequest.getAttribute("author", RequestAttributes.SCOPE_REQUEST));
        return map;
    }

}
Modbus RTU/TCP 协议详解与Spring Boot集成指南 Modbus是一种串行通信协议,由Modicon公司(现为施耐德电气)于1979年发布。开放性:免费使用,无需许可证简单性:易于实现和维护可靠性:具有错误检测机制广泛支持:几乎所有PLC和工业设备都支持。 阅读详情

相关推荐

Modbus RTU/TCP 协议详解与 Spring Boot 集成指南

本文档全面讲解Modbus协议及其在SpringBoot中的实现。主要内容包括:1. Modbus协议基础:介绍主从架构、四种数据类型(线圈、离散输入、保持/输入寄存器)及三种传输方式(RTU/ASCII/TCP)。2. 核心功能实现:详细解析常用功能码(0x01-0x10)及帧结构,提供Java代码示例。3. SpringBoot集成:展示TCP/RTU两种通信方式的配置类、服务类实现和REST API设计。4. 实战案例:以温室监控系统为例,演示完整的寄存器映射、数据模型和业务服务开发。5. 问题排查:

weixin_51040479的博客 877

Springboot 系列(七)web 开发之异常错误处理机制剖析

前言 相信大家在刚开始体验 Springboot 的时候一定会经常碰到这个页面,也就是访问一个不存在的页面的默认返回页面。 如果是其他客户端请求,如接口测试工具,会默认返回JSON数据。 { "timestamp":"2019-01-0622:26:16", "status":404, "error":"NotFound", ...

spring_root的博客 1072

Spring Boot整合Netty构建长连接服务:从协议设计到心跳重连实战

在网络编程中,高性能、高并发的通信需求催生了NIO(非阻塞I/O)技术的广泛应用。其核心原理在于通过事件驱动模型,允许单个线程处理多个连接通道,从而大幅提升资源利用率和系统吞吐量。这一技术价值在物联网、实时通信、游戏服务器等需要处理海量并发连接的场景中尤为突出。Netty作为Java领域成熟的NIO框架,封装了底层复杂细节,提供了易于使用的API。结合Spring Boot的便捷开发与依赖管理能力,可以高效构建稳定可靠的长连接服务。本文聚焦于**自定义编解码器**的设计与实现,以解决TCP粘包/拆包问题,并

weixin_34354173的博客 335

SpringBoot项目开发常见问题

在多模块的maven项目中,如果当前项目引用的模块中注入了相同的bean,会提示重复注入错误。

雨橙Orainge的博客 1473

【SpringBoot 4.x 第1节】夯爆了,为什么现在要学 Spring Boot 4.x?从零开始理解版本体系、核心变化与真实项目开发路线(超详解)!

🏆 本文收录于 《滚雪球学 Spring Boot 4.x》 专栏。 本专栏面向 有一点 Java 基础,但没有系统学过 Spring Boot 的读者,采用“滚雪球式学习法”:先跑通、再理解、再重构、再上线,最终带你从第一个 Hello API 一路完成一个可部署、可监控、可扩展的后端项目。

**My Coding Family** 1万+

大模型之Spring AI实战系列(十三):Spring Boot + OpenAI 基于 Tool Calling 实现单个外部工具调用

在上一篇文章中,我们学习了如何基于 RAG 架构构建一个私有知识问答系统。本文将继续深入 Spring AI 的能力,介绍**如何使用 `Tool Calling` 实现插件化功能调用**。 我们将基于下面示例项目,演示如何通过自定义工具类扩展大语言模型的能力,使其能够调用外部函数获取实时信息(如当前时间),从而解决传统 LLM 无法访问外部世界的问题。

寻道AI,探索AI无限可能! 2638

SpringBoot第四章: 处理全局异常

我们在springmvc中有讲过处理全局异常,当然,springboot也是有全局异常处理的。 一. 自定义 处理常见的404和 505 页面。 例如,我们输入了一个程序中不存在的路径,那么会跳转到404找不到的界面。 输入:http://localhost:8080/j/show1 其实,springboot中还自带有自定义处理404.html和500.html异常。 只需要在resources/templates目录下放入error.html就可以进行页面自定义跳转, 但前提是需...

逼哥很疯狂的博客 744

YOLOv5实战:无人机巡检图片差异对比与违建标记(附完整代码)

本文详细介绍了如何利用YOLOv5目标检测技术实现无人机巡检图片差异对比与违建标记。通过图像对齐、目标检测、差异分析和可视化标记四个步骤,构建高效的违建识别系统,显著提升城市管理效率。文章包含完整代码实现和性能优化技巧,为计算机视觉在无人机巡检中的应用提供实用指南。

weixin_42535720的博客 282

springboot启动错误日志分析

错误日志分析: (1)情况描述:启动springboot工程如果出现以下ERROR日志: Mapped "{[/error]}" onto public org.springframework.http.ResponseEntity<java.util.Map<java.lang.String, java.lang.Object>> org.springframewo...

HaleyLiu123的博客 5313

Android Studio打包全攻略---从入门到精通

初出茅庐 手动打包怎么手动打包项目写完了,现在需要把应用上传到市场,问题出现—怎么把代码变成.apk(Android的可安装文件)。 1. 创建签名文件 2. 填写好签名参数 3. 生成APK 注意:签名的密码和密匙的密码注意保管,不要忘了,签名文件别泄漏了,也别搞丢了为什么要打包我最开始就有这个疑问,我们的代码不是点了下运行按钮就直接安装到手机上了吗,我们在在项目Project

我早就想,要这样载着你,翻山越岭 2万+

QT绘制饼图+柱状图+折线图

使用qt绘制,折线图,饼图,柱状图,多柱状图

梅山 3878

Spring Boot |错误处理机制

文章目录一、SpringBoot错误处理机制1.1 默认错误处理1.2 错误处理原理二、定制错误页面(实现)2.1 服务端:定制错误的页面2.2 客户端:定制错误的json数据 一、SpringBoot错误处理机制 1.1 默认错误处理 浏览器访问出现错误时,会返回一个默认的错误页面。 其他客户端访问出现错误,默认响应一个json数据。 { "timestamp":"2020-05-07T0...

匿名攻城狮 5850

Vue3+Element Plus:构建现代化后台管理系统的核心布局实践

本文详细介绍了使用Vue3和Element Plus构建现代化后台管理系统的核心布局实践。从开发环境搭建到核心布局设计,再到动态菜单与路由集成,提供了完整的解决方案和优化技巧。特别适合需要快速开发高效、响应式后台系统的开发者,通过实战案例展示了如何提升开发效率和系统性能。

weixin_28309723的博客 459

Spring boot异常处理机制

1、springboot默认错误处理机制 spring boot默认异常处理机制用浏览器请求时返回错误页面,其他应用请求时返回json数据。如下 编写控制器 import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; /**...

MrLee的博客 1145

Cursor+Playwright MCP实现UI全自动化,告别繁琐元素定位!

摘要:本文探讨了利用Cursor和PlaywrightMCP实现UI自动化测试的创新方法。通过将AI编程助手与浏览器自动化技术结合,解决了传统UI自动化测试中元素定位繁琐、维护成本高等痛点。文章详细介绍了项目架构设计、AI使用技巧(包括精准提问和编写.mdc规则文档),以及如何实现自然语言测试用例到自动化脚本的转换。最终实现了测试人员只需输入手工测试步骤,AI即可自动生成完整测试代码的智能化流程,并展望了通过Excel表格一键生成测试用例的未来发展方向,为UI自动化测试提供了高效解决方案。

baidu_29774881的博客 2794

欧姆龙485通讯示例程序_【精品实验】PLC学习神器与温湿度变送器的通讯

BFH点击蓝字关注我们↑↑↑↑  PLC学习神器提供RS485接口,可支持无协议RS指令、无协议RS2指令、Modbus通讯功能,可通过设置通讯格式改变通讯协议,RS485对应的通讯格式地址是D8400;  本案例以RS485接口与温湿度变送器通讯,通讯格式如下一温湿度变送器的说明书介绍1.1主要技术参数1.2 通讯协议 1、所有通讯回路都应遵照主/从方式。依照主从方式,数据可以在一个主...

weixin_39860201的博客 1万+

Spring Boot中404错误的深度解析与解决方案

HTTP 404状态码表示服务器无法找到请求的资源,在Spring Boot框架中,这种错误可能由多种机制触发。DispatcherServlet作为统一入口,会通过HandlerMapping寻找匹配的处理器,若未找到则抛出NoHandlerFoundException。Spring Boot 2.3.x后需显式配置才能捕获该异常。常见404诱因包括URL路径不匹配、静态资源位置错误及版本升级导致的路径处理变化。通过全局异常处理、精细化日志监控及前端路由协调,可以有效解决这些问题。在微服务架构中,404问

weixin_34355559的博客 482

解锁PyCharm+Deepseek:本地部署AI编程超能力

在本次探索中,我们成功地在 PyCharm 中实现了 DeepSeek 的本地化部署,这一过程虽然涉及多个步骤,但每一步都为我们开启 AI 编程大门奠定了基础。从安装最新版 PyCharm,确保我们拥有一个功能强大且兼容性良好的开发环境,到注册 DeepSeek 账号并获取 API Key,这是连接我们与强大 AI 能力的关键纽带。接着,在 PyCharm 中安装 Continue 插件并进行精细配置,让 DeepSeek 能够深度融入我们的编程流程。

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 5548

【Spring Boot】异常处理

异常处理用于解决一些程序无法掌控,但又必须面对的情况。例如,程序需要读取文件、连接网络、使用数据库等,但可能文件不存在、网络不畅通、数据库无效等情况。为了程序能继续运行此时就需要把这些情况进行异常处理。

Data · Model · Agent · Repeat 2083

使用Simulink进行四足机器人的非线性动力学建模与仿真

四足机器人的运动包含多个自由度(DOF),包括腿部的摆动和支撑阶段的动力学特性。由于存在接触力、摩擦以及不同地形的影响,四足机器人的动力学行为呈现出高度的非线性特征。因此,构建准确的非线性动力学模型对于研究机器人的运动学和动力学特性至关重要。定义代表机器人状态的变量,如位置、速度、角度和角速度。matlab深色版本通过本指南,我们介绍了如何基于Simulink搭建一个四足机器人的非线性动力学模型,并进行了详细分析。

xiaoheshang_123的博客 311

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

Springboot 系列(七)Spring Boot web 开发之异常错误处理机制剖析

Springboot 系列(七)Spring Boot web 开发之异常错误处理机制剖析

w36680130的博客 87

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

redis知识点+redis在spring boot中实战

命令入队 (Queuing): 在 MULTI 之后的命令不会立即执行,被放入内部队列。Redis 对入队命令进行语法检查,语法错误会标记该事务为错误事务,但事务不会立即终止。这意味着如果客户端在 MULTI 和 EXEC 之间连接断开,队列中的命令将永远不会被执行。1>接收前端发起请求,执行数据叠加,将结果返回前端。如果事务在入队阶段被标记为语法错误,Redis 拒绝执行整个事务,返回 EXECABORT 错误。每次访问,刷新,发起请求向后端获取叠加后数据,将响应的数据显示在页面上。EXEC:执行事务。

weixin_42017951的博客 347

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Spring Boot集成Spring Cloud Circuit Breaker进行熔断管理

Spring Cloud Circuit Breaker为Spring Boot应用提供了熔断管理功能,帮助开发者避免服务故障的扩散。同时,熔断器的监控功能也为系统的稳定性提供了保障。在微服务架构中,服务间的依赖关系错综复杂,一旦某个服务出现故障,可能会迅速传播到整个系统,导致服务不可用。熔断器模式是一种错误处理机制,当某个服务调用失败的次数超过设定的阈值时,熔断器会“打开”,阻止进一步的调用,从而给予服务恢复的时间。大家好,我是微赚淘客返利系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!

技术研究中心 767

Spring Boot数据库密码加密实战:Jasypt配置安全与最佳实践

在应用开发中,配置安全是数据保护的基础环节。其核心原理是通过加密算法将配置文件中的敏感信息(如数据库密码)从明文转换为密文,即使配置文件意外泄露,攻击者也无法直接获取有效信息。这项技术的核心价值在于以低成本显著提升应用安全基线,满足基本的安全合规要求,尤其适用于防止因代码仓库泄露或运维疏忽导致的核心数据暴露。在实际工程中,对称加密算法如基于密码的加密(PBE)因其实现简单、性能良好而被广泛采用。对于Spring Boot技术栈,Jasypt库凭借其轻量级、与Spring生态无缝集成的特性,成为实现配置属性加

快马扬鞭须努力! 454

基于Spring Boot的学生管理系统的设计与实现

现今学生学籍管理的巨大的数据量给管理人员带来了诸多不便,教学管理缺少一种更加完善、灵活性更强、运行稳定、节省时间、正确率更高的学生学籍管理软件,为了学生档案的管理更加方便快捷,此项目应运而生,能帮助教研人员利用最新的开发工具,快速方便的对学生学籍管理进行管理、输入、输出、查找的所需操作,使散乱的学生档案能够具体化,直观化、合理化。对于此次项目,主要采用黑盒测试,因为对于这样规模小,结构相对简单的系统,并不太需要着重关心其内部结构,重要的是其功能是否实现和逻辑处理是否能正常完成。该表的结构如表1所示。

2302_78411932的博客 1741

外观模式 (Facade) 实战:Spring Boot 3.x 中封装 3 个第三方服务的统一 API 接口

本文详细介绍了如何在Spring Boot 3.x中使用外观模式(Facade)封装多个第三方服务的统一API接口。通过实战案例,展示了如何简化短信、支付和存储服务的调用,提供一致的接口风格和错误处理,有效降低系统复杂度并提升可维护性。

weixin_33860553的博客 446
上一篇: 06.Spring Framework 源码解析之 web 启动原理
下一篇: 06.Spring Boot 之 web 容器装配原理
masteryourself
博客等级 码龄9年 13粉丝 48原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值