Spring源码学习(拓展篇):SpringMVC中的异常处理

news/2024/10/22 14:27:48/

目录

  • 前言
  • SimpleMappingExceptionResolver
  • 通过接口 HandlerExceptionResolver 实现
  • 通过 @ExpceptionHander+ @ControllerAdvice 注解实现(推荐)

前言

SpringMVC的异常处理主要有以下三种方式:

  • 使用SpringMVC自带的异常处理类:SimpleMappingExceptionResolver
  • 自定义异常处理类:实现HandlerExceptionResolver接口
  • 使用注解:@ExpceptionHander+ @ControllerAdvice

SimpleMappingExceptionResolver

SimpleMappingExceptionResolver 异常处理器是 SpringMVC 定义好的异常处理器,具有以下特点。

  • 优点:集成简单、有良好的扩展性、对已有代码没有入侵性等
  • 缺点:该方法仅能获取到异常信息,对需要获取除异常以外的数据的情况不适用

在 SpingMVC 的配置文件中配置 SimpleMappingExceptionResolver 异常处理器

<!-- 配置异常映射 -->
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver" id="exceptionResolver"><!-- exceptionAttribute属性:设置将异常对象存入请求域时使用的属性名,默认使用"exception"作为属性名 --><property name="exceptionAttribute" value="exception"></property><!-- 用于指定具体的不同类型的异常所对应的异常响应页面。 --><property name="exceptionMappings"><props><!-- key属性:指定异常类型 --><!-- 文本标签体:指定和异常对应的逻辑视图名称 --><!-- 根据异常类型进行精确匹配,子类异常类型不匹配,才匹配父类异常类型 --><prop key="java.lang.ArithmeticException">show-message</prop><prop key="java.lang.RuntimeException">show-runtime-message</prop><prop key="java.lang.Exception">show-exception-message</prop></props></property><!-- 指定默认的异常响应页面。若发生的异常不是exceptionMappings中指定的异常,则使用默认异常响应页面。 --><property name="defaultErrorView" value="error"></property>
</bean>

JSP中获取异常信息如下:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html><head><title>异常信息页面</title></head><body><h1>系统信息</h1>异常对象:${requestScope.exception}<br/>异常消息:${requestScope.exception.message}<br/></body>
</html>

通过接口 HandlerExceptionResolver 实现

自定义异常处理器类

java">public class TestExceptionHandler implements HandlerExceptionResolver {@Overridepublic ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler,Exception ex) {// 处理异常的逻辑// 可以设置错误视图、返回错误代码、记录异常信息等ModelAndView modelAndView = new ModelAndView("show-message");modelAndView.addObject("exception", ex);return modelAndView;}
}

在 SpringMVC 配置文件中配置异常处理器

java"><bean class="com.changjunkai.config.TestExceptionHandler"></bean>

其实最后效果和上面的没啥区别,也是把异常对象给放到了域里

通过 @ExpceptionHander+ @ControllerAdvice 注解实现(推荐)

@ControllerAdvice 注解是 Spring Framework 中的一个注解,用于标识一个类为全局的控制器 advice (控制器增强)。
使用 @ControllerAdvice 注解的类可以提供以下功能:

  • 全局异常处理:可以使用 @ExceptionHandler 注解在 @ControllerAdvice 类中定义异常处理方法,以处理控制器中抛出的异常。这些方法可以捕获特定的异常类型,并返回相应的响应,如错误页面或错误信息
  • 全局数据验证:可以使用 @InitBinder 注解在 @ControllerAdvice 类中定义数据绑定初始化方法,以在请求处理之前对参数进行验证或自定义数据绑定规则
  • 全局拦截器:可以使用 @Interceptor 注解在 @ControllerAdvice 类中定义拦截器方法,以拦截所有控制器方法的调用,并在调用之前或之后执行额外的操作,如日志记录、权限检查等
  • 统一响应处理:可以使用 @ResponseBody 注解在 @ControllerAdvice 类中定义响应处理方法,以统一处理控制器方法的返回值,并将其转换为合适的响应格式,如 JSON 或 HTML (@RestControllerAdvice注解就相当于@ControllerAdvice+@ResponseBody)

PS:使用 @ExceptionHandler 注解在 @Controller 类中定义的异常处理方法,只能作用于该类,无法处理全局异常。

java">// 这个注解表示当前类是一个异常映射类
@ControllerAdvice
public class MyException {// 在@ExceptionHandler注解中指定异常类型@ExceptionHandler(value = {RuntimeException.class, ArithmeticException.class})public ModelAndView exceptionMapping(Exception exception) {// 方法形参位置接收SpringMVC捕获到的异常对象// 可以将异常对象存入模型;将展示异常信息的视图设置为逻辑视图名称ModelAndView modelAndView = new ModelAndView();modelAndView.addObject("exception", exception);modelAndView.setViewName("show-message");// 打印一下信息System.out.println(exception.getMessage());return modelAndView;}
}

如有侵扰,联系删除。 内容仅用于自我记录学习使用。如有错误,欢迎各位大佬指正


http://www.ppmy.cn/news/1538372.html

相关文章

git的提取和拉取有啥区别

在Git中&#xff0c;“提取”&#xff08;fetch&#xff09;和“拉取”&#xff08;pull&#xff09;是两个不同的概念&#xff0c;它们分别对应不同的操作行为&#xff1a; 提取&#xff08;Fetch&#xff09; git fetch 命令主要用于从远程仓库下载最新的提交信息到本地仓库…

《机器学习与数据挖掘综合实践》实训课程教学解决方案

一、引言 随着信息技术的飞速发展&#xff0c;人工智能已成为推动社会进步的重要力量。作为人工智能的核心技术之一&#xff0c;机器学习与数据挖掘在各行各业的应用日益广泛。本方案旨在通过系统的理论教学、丰富的实践案例和先进的实训平台&#xff0c;帮助学生掌握机器学习…

【优选算法】(第三十五篇)

目录 验证栈序列&#xff08;medium&#xff09; 题目解析 讲解算法原理 编写代码 N叉树的层序遍历&#xff08;medium&#xff09; 题目解析 讲解算法原理 编写代码 验证栈序列&#xff08;medium&#xff09; 题目解析 1.题目链接&#xff1a;. - 力扣&#xff08;L…

vue3学习:数字时钟遇到的两个问题

在前端开发学习中&#xff0c;用JavaScript脚本写个数字时钟是很常见的案例&#xff0c;也没什么难度。今天有时间&#xff0c;于是就用Vue的方式来实现这个功能。原本以为是件非常容易的事&#xff0c;没想到却卡在两个问题上&#xff0c;一个问题通过别人的博文已经找到答案&…

vue3中的computed属性

模板界面&#xff1a; <template><div class"person"><h2>姓&#xff1a; <input type"text" v-model"person.firstName" /></h2><h2>名&#xff1a; <input type"text" v-model"person…

Maven打包运行,引入三方jar及打包,不导入本地库的方法

Maven打包运行&#xff0c;引入三方jar及打包&#xff0c;不导入本地库的方法 maven、打包、springboot、jar、本地、引入背景 业务系统要对接某硬件&#xff0c;需要用到其三方jar&#xff0c;maven官方仓库没有这个&#xff0c;我也没有maven&#xff0c;又不想mvn install…

通过Python构建自动化股票分析工具:从数据抓取到技术分析与买卖信号生成

解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 前言 股票市场是一个高度复杂和波动的领域,投资者常常需要依赖技术分析和数据驱动的策略来做出买卖决策。借助Python,我们可以轻松自动化这些任务,帮助我们分析股票趋势、判断买卖时机,并生成交易信号。本文…

TensorFlow 的核心概念

TensorFlow 是一个开源的机器学习框架&#xff0c;由 Google 开发和维护。它提供了一个强大的工具集&#xff0c;用于构建和训练各种机器学习模型。 TensorFlow 的核心概念是计算图&#xff08;Computational Graph&#xff09;。计算图由节点&#xff08;Nodes&#xff09;和…