SpringBoot 异常处理机制

  • 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);}@RequestMappingpublic 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.hqwc.cn/news/19882.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

34.RocketMQ之Broker端消息存储流程详解

highlight: arduino-light Broker消息存储概要设计 RocketMQ主要存储的文件包括Commitlog文件&#xff0c;ConsumeQueue文件&#xff0c;IndexFile文件。 RMQ把所有主题的消息存储在同一个文件中&#xff0c;确保消息发送时顺序写文件。 为了提高消费效率引入了ConsumeQueue消息…

云原生(第六篇)k8s-kubeadmin部署

master&#xff08;2C/4G&#xff0c;cpu核心数要求大于2&#xff09; 192.168.169.10 docker、kubeadm、kubelet、kubectl、flannel node01&#xff08;2C/2G&#xff09; 192.168.169.30 docker、kubeadm、kubelet、kubect…

如何解决git中拉取或提交代码出现的ssl证书问题?

问题描述 执行命令的时候&#xff0c;出现"…certificate problem…"报错&#xff0c;一般在执行"git push“ (推送分支) 或者 “git clone”(克隆仓库)时出现&#xff0c;原因时因为SSL安全验证问题&#xff0c;不能获取到本地的的证书。那么如何解决这个问题…

SpringBoot 如何使用 MockMvc 进行 Web 集成测试

SpringBoot 如何使用 MockMvc 进行 Web 集成测试 介绍 SpringBoot 是一个流行的 Java Web 开发框架&#xff0c;它提供了一些强大的工具和库&#xff0c;使得开发 Web 应用程序变得更加容易。其中之一是 MockMvc&#xff0c;它提供了一种测试 SpringBoot Web 应用程序的方式&…

Microsoft Remote Desktop for mac安装教程

适用于Mac的Microsoft远程桌面测试版&#xff01;Microsoft Remote Desktop Beta for Mac是一种远程工具&#xff0c;允许用户从Mac远程访问基于Windows的计算机。使用此工具&#xff0c;用户可以随时随地使用Mac连接到远程桌面、应用程序和资源。 Microsoft Remote Desktop B…

2023年Arm最新处理器架构分析——X4、A720和A520

1、引言 上一篇文章我们介绍了Arm的Cortex-X1至Cortex-X3系列处理器&#xff0c;2023年的5月底&#xff0c;Arm如期发布了新一年的处理器架构&#xff0c;分别为超级大核心Cortex-X4&#xff0c;大核心A720和小核心A520。在智能手机行业&#xff0c;Arm始终保持每年一迭代的处…

【GCD+MST】ABC210 E

这道题告诉我们&#xff0c;一道题一定要去手摸样例&#xff0c;多造几个数据&#xff0c;然后找思路 很多时候&#xff0c;题目看错了&#xff0c;码完发现思路错了&#xff0c;调半天调不出来&#xff0c;思路一直在旧框架打转&#xff0c;这些情况都是不去考察实际情况导致…

超速Python编程:利用缓存加速你的应用程序

引言 在软件开发中&#xff0c;缓存是一种常用的技术&#xff0c;用于提高系统性能和响应速度。Python提供了多种缓存技术和库&#xff0c;使我们能够轻松地实现缓存功能。本文将带您从入门到精通&#xff0c;逐步介绍Python中的缓存使用方法&#xff0c;并提供实例演示。 1.…

《MySQL》复合查询和连接

文章目录 查询单行子查询多行子查询合并查询 连接内连接外连接 点睛之笔&#xff1a;无论是多表还是单表&#xff0c;我们都可以认为只有一张表。 只要是表&#xff0c;就可以查询和连接成新表&#xff0c;所以select出来的结果都可以认为成一张表&#xff0c;既然是一张表&…

WAIC2023会后记

听了3天WAIC的会&#xff0c; 大开眼界&#xff0c;算是上了堂大课。 本次参会的目的是听听AI企业信息化的想法、理论和实践。以进一步探索可能的业务场景。三天的会结束后&#xff0c;留下深刻印象的有如下几点。 大模型当道 2023这次大会的主题成了大模型&#xff0c;谈的…

ElasticSearch学习笔记一——下载及安装

最近发现ES是个很重要的内容啊&#xff0c;各种大厂都会使用ES来做一些大范围的搜索之类的功能&#xff0c;所以今天我们也来学习一下。 首先我们要准备Java的环境&#xff0c;推荐版本8、11、14 ES官方的JDK兼容性列表(有些慢&#xff0c;需要耐心等待一下哈) 在我写文章时&…

iview-admin使用小结

首先在使用一个框架之前一定要完整的看一下相关文档&#xff0c;因为框架中会封装常用的功能&#xff0c;也会更加符合大众要求。在ui设计图上&#xff0c;可能实现某个功能设计图中给出的交互并不是很好&#xff0c;而在框架中有更好的组件可以实现&#xff0c;但因为没有看文…