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

devtools/2024/10/9 9:12:07/

目录

  • 前言
  • 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/devtools/122396.html

相关文章

滚雪球学Oracle[2.4讲]:创建Oracle数据库实例

全文目录&#xff1a; 前言一、使用DBCA进行复杂环境下的实例创建1.1 使用DBCA的步骤案例演示&#xff1a;DBCA创建实例 1.2 优点与适用场景 二、手动创建数据库实例的步骤与脚本2.1 手动创建数据库实例的步骤案例演示&#xff1a;手动创建Oracle数据库实例 2.2 手动创建的优点…

3DGS中Densification梯度累计策略的改进——绝对梯度策略(Gaussian Opacity Fields)

在学习 StreetGS 代码中发现了其中的 Densification 策略与原 3DGS 不太一样&#xff0c;其是使用的 Gaussian Opacity Fields 中的一个的策略 我们先来回忆一下 3DGS 中一个比较重要 contribution&#xff1a;自适应密度控制 1 自适应密度控制 其具体步骤如下&#xff1a; …

CUDA cooperative_groups grid_group测试

CUDA cooperative_groups grid_group测试 一.测试描述及小结1.任务描述2.输出3.小结 二.复现步骤三.grid_group.sync 代码对照1.CUDA C2.PTX3.SASS CUDA Cooperative Groups是CUDA编程模型中引入的一组高级特性&#xff0c;提供了更灵活的线程组织和同步机制 通过Cooperative G…

C 语言入门指南:致大一新生

亲爱的大一新生们&#xff1a; 当你踏入大学的校门&#xff0c;开启全新的学习之旅时&#xff0c;C 语言或许会成为你在计算机世界中探索的重要起点。C 语言作为一种广泛应用且基础的编程语言&#xff0c;掌握它将为你打开编程世界的大门。 一、认识 C 语言 C 语言是一种结构化…

一个简单的SQL面试题

最近面试遇到一个SQL题&#xff0c;复述如下&#xff1a; SQL面试题 现在有两张表&#xff0c;结构如下&#xff1a; 学生表&#xff08;student&#xff09; 学号sid姓名name1张三2李四3王五 成绩表&#xff08;score&#xff09; 序号id学号sid科目subject分数score11语…

【优选算法】(第十一篇)

目录 ⼭峰数组的峰顶&#xff08;easy&#xff09; 题目解析 讲解算法原理 编写代码 寻找峰值&#xff08;medium&#xff09; 题目解析 讲解算法原理 编写代码 ⼭峰数组的峰顶&#xff08;easy&#xff09; 题目解析 1.题目链接&#xff1a;. - 力扣&#xff08;Leet…

【CSS Tricks】试试新思路去处理文本超出情况

目录 引言一、常规套路1. 单行文本省略2. 多行文本省略 二、新思路美化一下1. 单行/多行文本隐藏2. 看下效果 三、总结 引言 本篇为css的一个小技巧 文本溢出问题是一个较为常见的场景。UI设计稿为了整体的美观度会将文本内容限制到一定范围内&#xff0c;然而UI设计阶段并不能…

GPT带我学-设计模式16-原型模式

概述 原型模式是一种创建型设计模式&#xff0c;它允许通过复制现有对象来创建新对象&#xff0c;而不是通过类的构造函数。这个模式特别适用于对象创建开销较大或者对象需要频繁被创建和销毁的场景。 主要组成部分&#xff1a; 原型接口&#xff1a;声明一个克隆自身的方法。…