Spring MVC 中的异常处理器

1. Spring MVC 中的异常处理器

文章目录

  • [1. Spring MVC 中的异常处理器](#1. Spring MVC 中的异常处理器)
  • [2. 什么是异常处理器](#2. 什么是异常处理器)
  • [3. 自定义的异常处理器](#3. 自定义的异常处理器)
    • [3.1 通过 XML 配置文件的方式](#3.1 通过 XML 配置文件的方式)
    • [3.2 通过注解的方式](#3.2 通过注解的方式)
  • [4. 总结:](#4. 总结:)
  • [5. 最后:](#5. 最后:)

2. 什么是异常处理器

Spring MVC 在 处理器方法 执行过程中出现了异常,可以采用 异常处理器 进行应对。

一句话概括异常处理器作用:处理器方法执行过程中出现了异常,跳转都对应的视图,在视图上展示友好信息。

Spring MVC 为异常处理提供了一个接口:HandlerExceptionResolver

核心方法是:resolveException。

该方法用来编写具体的异常处理方案。返回值ModelAndView,表示异常处理完之后跳转到哪个视图。

HandlerExceptionResolver 接口有两个常用的默认实现:

  • DefaultHandlerExceptionResolver

  • SimpleMappingExceptionResolver

DefaultHandlerExceptionResolver 是默认的异常处理器。

核心方法:

当请求方式和处理方式不同时,DefaultHandlerExceptionResolver的默认处理态度是:

3. 自定义的异常处理器

自定义异常处理器需要使用:SimpleMappingExceptionResolver

自定义异常处理机制有两种方式:

  • 通过XML配置文件

  • 通过注解

3.1 通过 XML 配置文件的方式

在 springmvc.xml 配置如下信息即可

xml 复制代码
<!--    配置属于自己的异常处理器-->
    <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
        <property name="exceptionMappings">
            <props>
<!--                这里可以配置很多键值对,key是异常,要提供具体的异常类型,包括报名-->
                <!--用来指定出现异常后,跳转的视图-->
<!--                以下的配置表示,只要发送异常,都跳转到 tip视图-->
                <prop key="java.lang.Exception">tip</prop>
            </props>
        </property>
        <!--将异常信息存储到request域,value属性用来指定存储时的key。-->
<!--        以下配置的含义是:将当前发送的异常对象存储到 request域当中-->
<!--        底层会执行这样的代码 request.setAttribute("yichang",异常对象 java.lang.Exception )-->
        <property name="exceptionAttribute" value="yichang"/>
<!--        request.setAttribute(key,value)-->
    </bean>
xml 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">



    <!--    组件扫描-->
    <context:component-scan base-package="com.rainbowsea.springmvc.controller"></context:component-scan>

    <!--    视图解析器-->
    <bean id="thymeleafViewResolver" class="org.thymeleaf.spring6.view.ThymeleafViewResolver">
        <!--作用于视图渲染的过程中,可以设置视图渲染后输出时采用的编码字符集-->
        <property name="characterEncoding" value="UTF-8"/>
        <!--如果配置多个视图解析器,它来决定优先使用哪个视图解析器,它的值越小优先级越高-->
        <property name="order" value="1"/>
        <!--当 ThymeleafViewResolver 渲染模板时,会使用该模板引擎来解析、编译和渲染模板-->
        <property name="templateEngine">
            <bean class="org.thymeleaf.spring6.SpringTemplateEngine">
                <!--用于指定 Thymeleaf 模板引擎使用的模板解析器。模板解析器负责根据模板位置、模板资源名称、文件编码等信息,加载模板并对其进行解析-->
                <property name="templateResolver">
                    <bean class="org.thymeleaf.spring6.templateresolver.SpringResourceTemplateResolver">
                        <!--设置模板文件的位置(前缀)-->
                        <property name="prefix" value="/WEB-INF/templates/"/>
                        <!--设置模板文件后缀(后缀),Thymeleaf文件扩展名不一定是html,也可以是其他,例如txt,大部分都是html-->
                        <property name="suffix" value=".html"/>
                        <!--设置模板类型,例如:HTML,TEXT,JAVASCRIPT,CSS等-->
                        <property name="templateMode" value="HTML"/>
                        <!--用于模板文件在读取和解析过程中采用的编码字符集-->
                        <property name="characterEncoding" value="UTF-8"/>
                    </bean>
                </property>
            </bean>
        </property>
    </bean>


    <!--    配置视图的控制器,报红是,没有整个文件,ide的误报,这里是没有问题的-->
<!--    <mvc:view-controller path="/" view-name="index" />-->


    <!--    开启默认的Servlet处理-->
    <mvc:default-servlet-handler></mvc:default-servlet-handler>


    <!--    开启注解驱动-->
    <mvc:annotation-driven/>

<!--    配置属于自己的异常处理器-->
    <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
        <property name="exceptionMappings">
            <props>
<!--                这里可以配置很多键值对,key是异常,要提供具体的异常类型,包括报名-->
                <!--用来指定出现异常后,跳转的视图-->
<!--                以下的配置表示,只要发送异常,都跳转到 tip视图-->
                <prop key="java.lang.Exception">tip</prop>
            </props>
        </property>
        <!--将异常信息存储到request域,value属性用来指定存储时的key。-->
<!--        以下配置的含义是:将当前发送的异常对象存储到 request域当中-->
<!--        底层会执行这样的代码 request.setAttribute("yichang",异常对象 java.lang.Exception )-->
        <property name="exceptionAttribute" value="yichang"/>
<!--        request.setAttribute(key,value)-->
    </bean>
</beans>

在视图页面上展示异常信息:

html 复制代码
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>出错了,请联系管理员</h1>
<hr>
<!--从获取到请求域当中对应的内容-->
<div th:text="${yichang}"></div>

</body>
</html>

对应异常测试的 Controller 类的编写

java 复制代码
package com.rainbowsea.springmvc.controller;


import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@Controller  // 交给 Spring IOC 容器管理
public class IndexController {


    //@RequestMapping(value = "/index", method = RequestMethod.POST)
    @RequestMapping(value = "/index", method = RequestMethod.GET)
    public String toIndex() {

        String s = null;
        s.toString();
        return "index";
    }
}

运行测试:

3.2 通过注解的方式

第一步使用:@ControllerAdvice // 标注类的异常

@ControllerAdvice 注解是包含了 @Controller 注解的


第二步:使用@ExceptionHandler // 标注 处理器异常方法,可以标注多个不同异常的,处理方法器。

java 复制代码
/**
 * 自定义异常
 */
@ControllerAdvice  // 标注类的异常
public class ExceptionController {

    @ExceptionHandler  // 标注 处理器异常方法
    public String tip (Exception e, Model model) {
        // 将异常信息存储到请求域当中
        model.addAttribute("yichang",e);
        // 逻辑视图
        return "tip";
    }
}
java 复制代码
package com.rainbowsea.springmvc.controller;


import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;


/**
 * 自定义异常
 */
@ControllerAdvice  // 标注类的异常
public class ExceptionController {

    @ExceptionHandler  // 标注 处理器异常方法
    public String tip (Exception e, Model model) {
        // 将异常信息存储到请求域当中
        model.addAttribute("yichang",e);
        // 逻辑视图
        return "tip";
    }


    // 其他的异常处理视图  ClassCastException
    @ExceptionHandler  // 标注 处理器异常方法
    public String tip (ClassCastException e, Model model) {
        // 将异常信息存储到请求域当中
        model.addAttribute("yichang",e);
        // 逻辑视图
        return "tip";
    }

    // 可以自定义多个异常信息

    //@ExceptionHandler
    public String tip2 (Exception e, Model model) {

        return null;
    }


    //@ExceptionHandler
    public String tip3 (NullPointerException e, Model model) {

        return null;
    }
}

4. 总结:

  1. Spring MVC 在 处理器方法 执行过程中出现了异常,可以采用 异常处理器 进行应对。一句话概括异常处理器作用:处理器方法执行过程中出现了异常,跳转都对应的视图,在视图上展示友好信息。Spring MVC 为异常处理提供了一个接口:HandlerExceptionResolver

  2. 定义异常处理器需要使用:SimpleMappingExceptionResolver

    自定义异常处理机制有两种方式:

    • 通过XML配置文件

    • 通过注解

5. 最后:

"在这个最后的篇章中,我要表达我对每一位读者的感激之情。你们的关注和回复是我创作的动力源泉,我从你们身上吸取了无尽的灵感与勇气。我会将你们的鼓励留在心底,继续在其他的领域奋斗。感谢你们,我们总会在某个时刻再次相遇。"

相关推荐
泡海椒11 分钟前
告别 iText 繁杂配置:jquick-pdf 极简 PDF 生成实战(零基础上手)
java·开发语言·pdf
JaguarJack12 分钟前
PHP 8.6 只是个小版本,三十项弃用却已在为 PHP 9.0 铺路
后端·php·服务端
BingoGo14 分钟前
PHP 8.6 只是个小版本,三十项弃用却已在为 PHP 9.0 铺路
后端·php
步行cgn28 分钟前
Spring 注入 List 集合详解
windows·spring·list
Bs_MoneyMagnet3 小时前
基于springboot+vue的滑雪场票务与装备租赁系统的设计与实现 源码+文档
java·vue.js·spring boot·后端·spring·毕业设计·计算机毕业设计
AlienZHOU8 小时前
AI Coding 时代下,我的技术面试实践分享
前端·后端·面试
野生技术架构师9 小时前
2026 Java 面试全套总结,八股 + 场景 + AI 相关面试考点
java·人工智能·面试
香吧香9 小时前
java服务异常日志只打印异常类型,没有堆栈定位分析
java·jvm·异常
qq_25183645710 小时前
AI 疾病自查功能SpringbootAI项目实战 · 技术实现文档
java·ai·ai编程
狗头大军之江苏分军10 小时前
《潮水漫过十七岁》开学了
后端