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. 最后:

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

相关推荐
希忘auto24 分钟前
详解Servlet的使用
java·servlet·tomcat
ygl61503731 小时前
Vue3+SpringBoot3+Sa-Token+Redis+mysql8通用权限系统
java·spring boot·vue
Code哈哈笑1 小时前
【Java 学习】构造器、static静态变量、static静态方法、static构造器、
java·开发语言·学习
是老余1 小时前
Java三大特性:封装、继承、多态【详解】
java·开发语言
鸽鸽程序猿1 小时前
【JavaEE】Maven的介绍及配置
java·java-ee·maven
尘浮生2 小时前
Java项目实战II基于微信小程序的南宁周边乡村游平台(开发文档+数据库+源码)
java·开发语言·数据库·spring boot·微信小程序·小程序·maven
耀耀_很无聊6 小时前
第1章 初识SpringMVC
java·spring·mvc
麻衣带我去上学6 小时前
Spring源码学习(一):Spring初始化入口
java·学习·spring
东阳马生架构6 小时前
MySQL底层概述—1.InnoDB内存结构
java·数据库·mysql
手握风云-7 小时前
数据结构(Java版)第一期:时间复杂度和空间复杂度
java·数据结构