SpringBoot 异常处理机制

news2024/12/22 19:51:26
  • SpringBoot中异常处理的流程图
    在这里插入图片描述

在SpringBoot项目中,如果业务逻辑发生了异常,则首先看发生异常的类中有没有@ExceptionHandle能处理,如果能,则执行方法进行处理,如果没有,则去找全局的@ControllerAdvice注解,进行异常处理,如果还是不能处理,则继续看SpringMVC的异常处理机制能否处理,这里SpringMVC的异常处理机制就是可以处理默认的十几种异常,如请求类型错误Method Not Allowed,如请求体内容错误等,如果不能处理,则走SpringBoot提供的异常处理机制。SpringBoot的异常处理机制就是将当前异常请求重定向到/error请求,并且会自动根据内容协商是返回页面还是json数据。
所有有时当无法处理异常时,转发到/error请求后又会来带一些其他问题。

  • ErrorMvcAutoConfiguration 自动配置类
    ErrorMvcAutoConfiguration 这个类是SpringBoot提供用于处理异常机制的。

首先这个类中给容器中注入了一个 Controller

	@Bean
	@ConditionalOnMissingBean(value = ErrorController.class, search = SearchStrategy.CURRENT)
	public BasicErrorController basicErrorController(ErrorAttributes errorAttributes,
			ObjectProvider<ErrorViewResolver> errorViewResolvers) {
		return new BasicErrorController(errorAttributes, this.serverProperties.getError(),
				errorViewResolvers.orderedStream().collect(Collectors.toList()));
	}
@Controller
@RequestMapping("${server.error.path:${error.path:/error}}")
public class BasicErrorController extends AbstractErrorController {

	private final ErrorProperties errorProperties;

	/**
	 * Create a new {@link BasicErrorController} instance.
	 * @param errorAttributes the error attributes
	 * @param errorProperties configuration properties
	 */
	public BasicErrorController(ErrorAttributes errorAttributes, ErrorProperties errorProperties) {
		this(errorAttributes, errorProperties, Collections.emptyList());
	}

	/**
	 * Create a new {@link BasicErrorController} instance.
	 * @param errorAttributes the error attributes
	 * @param errorProperties configuration properties
	 * @param errorViewResolvers error view resolvers
	 */
	public BasicErrorController(ErrorAttributes errorAttributes, ErrorProperties errorProperties,
			List<ErrorViewResolver> errorViewResolvers) {
		super(errorAttributes, errorViewResolvers);
		Assert.notNull(errorProperties, "ErrorProperties must not be null");
		this.errorProperties = errorProperties;
	}

	@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, getErrorAttributeOptions(request, MediaType.TEXT_HTML)));
		response.setStatus(status.value());
		ModelAndView modelAndView = resolveErrorView(request, response, status, model);
		return (modelAndView != null) ? modelAndView : new ModelAndView("error", model);
	}

	@RequestMapping
	public ResponseEntity<Map<String, Object>> error(HttpServletRequest request) {
		HttpStatus status = getStatus(request);
		if (status == HttpStatus.NO_CONTENT) {
			return new ResponseEntity<>(status);
		}
		Map<String, Object> body = getErrorAttributes(request, getErrorAttributeOptions(request, MediaType.ALL));
		return new ResponseEntity<>(body, status);
	}

	@ExceptionHandler(HttpMediaTypeNotAcceptableException.class)
	public ResponseEntity<String> mediaTypeNotAcceptable(HttpServletRequest request) {
		HttpStatus status = getStatus(request);
		return ResponseEntity.status(status).build();
	}

	protected ErrorAttributeOptions getErrorAttributeOptions(HttpServletRequest request, MediaType mediaType) {
		ErrorAttributeOptions options = ErrorAttributeOptions.defaults();
		if (this.errorProperties.isIncludeException()) {
			options = options.including(Include.EXCEPTION);
		}
		if (isIncludeStackTrace(request, mediaType)) {
			options = options.including(Include.STACK_TRACE);
		}
		if (isIncludeMessage(request, mediaType)) {
			options = options.including(Include.MESSAGE);
		}
		if (isIncludeBindingErrors(request, mediaType)) {
			options = options.including(Include.BINDING_ERRORS);
		}
		return options;
	}

	/**
	 * Determine if the stacktrace attribute should be included.
	 * @param request the source request
	 * @param produces the media type produced (or {@code MediaType.ALL})
	 * @return if the stacktrace attribute should be included
	 */
	protected boolean isIncludeStackTrace(HttpServletRequest request, MediaType produces) {
		switch (getErrorProperties().getIncludeStacktrace()) {
			case ALWAYS:
				return true;
			case ON_PARAM:
				return getTraceParameter(request);
			default:
				return false;
		}
	}

	/**
	 * Determine if the message attribute should be included.
	 * @param request the source request
	 * @param produces the media type produced (or {@code MediaType.ALL})
	 * @return if the message attribute should be included
	 */
	protected boolean isIncludeMessage(HttpServletRequest request, MediaType produces) {
		switch (getErrorProperties().getIncludeMessage()) {
			case ALWAYS:
				return true;
			case ON_PARAM:
				return getMessageParameter(request);
			default:
				return false;
		}
	}

	/**
	 * Determine if the errors attribute should be included.
	 * @param request the source request
	 * @param produces the media type produced (or {@code MediaType.ALL})
	 * @return if the errors attribute should be included
	 */
	protected boolean isIncludeBindingErrors(HttpServletRequest request, MediaType produces) {
		switch (getErrorProperties().getIncludeBindingErrors()) {
			case ALWAYS:
				return true;
			case ON_PARAM:
				return getErrorsParameter(request);
			default:
				return false;
		}
	}

	/**
	 * Provide access to the error properties.
	 * @return the error properties
	 */
	protected ErrorProperties getErrorProperties() {
		return this.errorProperties;
	}

}

通过分析这个类的源码得知,此类主要就是给SpringMVC映射了两个请求,来处理 /error请求。
而两个方法分别是返回html页面与json数据的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/744629.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

X2000 Linux 调试VL53L4CD驱动

由于VL53L4CD具有更高的精度&#xff0c;更低的功耗&#xff0c;所以尝试将VL53L4CD移植到X2000上进行测试。 一、下载驱动 en.VL53L4CD_LinuxDriver 二、SDK中加入驱动 1、加入源码 在\module_driver\devices下创建VL53L4CD文件夹&#xff0c;再将\en.VL53L4CD_LinuxDriver…

Cyclo(Ile-Leu),91741-17-2,环(异亮氨酸-亮氨酸)二肽,可以根据实验需求定制

&#xff08;文章资料汇总来源于&#xff1a;陕西新研博美生物科技有限公司小编MISSwu&#xff09;​ Cyclo(Ile-Leu)&#xff0c;DL-isoleucyl-leucyl anhydride&#xff0c;环(异亮氨酸-亮氨酸)二肽&#xff0c;DL异亮氨酸酰酐 产品结构式&#xff1a; 产品规格&#xff1a;…

10.2.5 【Linux】变量的有效范围

在学理方面&#xff0c;为什么环境变量的数据可以被子程序所引用呢&#xff1f;这是因为内存配置的关系&#xff01;理论上是这样的&#xff1a; 当启动一个 shell&#xff0c;操作系统会分配一记忆区块给 shell 使用&#xff0c;此内存内之变量可让子程序取用 若在父程序利用…

从User-Agent获取浏览器类型

一、User-Agent User-Agent首部包含一个特征字符串&#xff0c;用来让网络协议的对端来识别发起请求的用户代理软件的应用类型、操作系统、软件开发商以及版本号。 二、从User-Agent中获取浏览器类型 1、通过自己编写js代码识别UA字符串中的浏览器类型 function getBrowser…

MobPush 工作台操作指南:查看推送数据

推送概况查询 进入“MobPush”的"概况"模块&#xff0c;查询推送整体的概况 推送详情查询 进入“MobPush”的"推送记录"模块 点击“详情”按钮&#xff0c;查看推送详情情况

请求响应-json参数的接收

JSON参数 JSON参数&#xff1a;JSON数据键名与形参对象属性名&#xff08;即实体类中的成员变量&#xff09;相同&#xff0c;定义POJO实体类即可接收参数&#xff0c;需要使用RequestBody标识前端发送JSON格式的数据&#xff0c;要使用POST方法发送请求&#xff0c;因为JSON格…

SpringBoot 项目使用 Elasticsearch 对 Word、Pdf 等文档内容的检索

本文参考自&#xff1a;https://blog.csdn.net/Q54665642ljf/article/details/127701719 本文适用于elasticsearch入门小白&#xff0c;还请大佬能指出我的不足&#xff08;本人其实也是刚学elasticsearch没多久&#xff09; 文章目录 一、准备工作1.1 安装ES文本抽取插件1.2 …

文件操作--按字符读写文件

目录 1、读写文件中的字符&#xff1a; 例题1&#xff1a;从键盘键入一串字符&#xff0c;然后把它们转存到磁盘文件上。 例题2&#xff1a;将0-127之间的ASCII字符写到文件中&#xff0c;然后从文件中读出并显示到屏幕上。 例题3&#xff1a;修改例题2判断读出的字符是否为…

【NeRF】相机的内外参是什么?单目相机是如何成像的?

文章目录 【NeRF】相机的内外参是什么&#xff1f;单目相机是如何成像的&#xff1f;1.相机外参2.相机内参 【NeRF】相机的内外参是什么&#xff1f;单目相机是如何成像的&#xff1f; 在做Nerf时对其中的一些原理感到困惑&#xff0c;因而把这些基础理论知识总结下来&#xff…

b站网页版视频投稿接口分析

b站网页版视频投稿接口分析 上传视频逻辑如下&#xff1a;1.预加载2.获取准备上传到服务器的数据3.分片上传&#xff08;块大小最大为10MB/10485760字节&#xff09;4.上传完成进行合片 上传封面逻辑如下&#xff1a;投稿视频&#xff1a; B站投稿视频&#xff08;手稿&#xf…

【深度学习】:用于 GAN 的生成器架构 - 生成人脸

一、说明 生成对抗网络(GAN)是机器学习中一个相对较新的概念,于2014年首次推出。他们的目标是合成与真实图像无法区分的人工样本,例如图像。GAN 应用程序的一个常见示例是通过从名人人脸数据集中学习来生成人工人脸图像。虽然GAN图像随着时间的推移变得更加逼真,但它们的主…

短视频seo矩阵源码私有化部署方案

目录 前 言 一。 短视频seo矩阵算法 二、 短视频seo源码功能构建 三、 短视频seo私有化部署流程解读 前 言 为了更好地提高短视频平台的SEO优化效果&#xff0c;许多企业开始尝试私有化部署方案。这样做的好处在于&#xff0c;企业可以根据自身的特点和需求来灵活调整矩阵源…

龙蜥开发者说:参与开源要敢于担任不同角色 | 第 21 期

「龙蜥开发者说」第 21 期来了&#xff01;开发者与开源社区相辅相成&#xff0c;相互成就&#xff0c;这些个人在龙蜥社区的使用心得、实践总结和技术成长经历都是宝贵的&#xff0c;我们希望在这里让更多人看见技术的力量。本期故事&#xff0c;我们邀请了龙蜥社区开发者支智…

教你纯小白选对Java路线

许多人问如何开启JAVA的入门这里有两个层次: 首先&#xff0c;你是一个局外人。你一天只用电脑一两个小时&#xff0c;玩游戏&#xff0c;其他什么都不知道。你听说JAVA很受欢迎&#xff0c;而且薪水很高&#xff0c;你想要开始学习如何入门。 这个入门&#xff0c;就是进入编程…

关于Apache-Commons-Lang3中元组的使用

关于Apache-Commons-Lang3中元组的使用 在日常工作中&#xff0c;有时候我们并不清楚有这些工具类的存在&#xff0c;造成在开发过程中重新实现导致时间浪费&#xff0c;且开发的代码质量不佳。而 apache 其实已经提供了系列的工具包给我们使用&#xff0c;只是大多数人&#x…

通过列排斥能比较两组迭代次数

( A, B )---3*30*2---( 1, 0 )( 0, 1 ) 让网络的输入只有3个节点&#xff0c;AB训练集各由6张二值化的图片组成&#xff0c;让差值结构中有6个1, 行分布是0&#xff0c;1&#xff0c;1&#xff0c;1&#xff0c;1&#xff0c;2列分布是2&#xff0c;2&#xff0c;2.统计迭代次…

回归预测 | MATLAB实现ELM极限学习机多输入单输出回归预测(多指标、相关图)

回归预测 | MATLAB实现ELM极限学习机多输入单输出回归预测(多指标、相关图) 目录 回归预测 | MATLAB实现ELM极限学习机多输入单输出回归预测(多指标、相关图)效果一览基本介绍程序设计学习总结参考资料效果一览 基本介绍 回归预测 | MATLAB实现ELM极限学习机多输入单输出回…

由于找不到d3dx9_43.dll,有什么可靠的修复方法?

由于找不到d3dx9_43.dll&#xff0c;无法继续执行代码&#xff0c;这种情况大家是否有遇见过&#xff1f;其实就算没遇到过&#xff0c;大家应该也有遇到别的dll文件丢失吧&#xff1f;道理都一样&#xff0c;都是dll文件丢失&#xff0c;我们只需要把它给修复就可以了&#xf…

第一阶段-第五章 Python的函数

目录 一、函数的介绍  1.学习目标  2. 什么是函数  3.本节的演示  4.为什么要学习、使用函数  5.本小节的总结 二、函数的定义  1.学习目标  2.函数的语法  3.本节的代码演示  4.本小节的总结  5.练习案例&#xff1a;自动查核酸 三、函数的参数  1.学习…

Mac 查看端口和关闭进程

经常使用 node 启动本地&#xff0c;有时一不小心按了 Ctrl Z &#xff08;Command Z&#xff09;把服务关闭了&#xff0c;但实际上没真正关闭该服务&#xff0c;再次启动服务很可能会提示端口号被占用。 系统环境&#xff1a;Mac 查看端口的详细端口占用情况 命令&#xf…