Spring MVC 中的异常处理器

1. Spring MVC 中的异常处理器


2. 什么是异常处理器

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

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

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

在这里插入图片描述

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

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

  • DefaultHandlerExceptionResolver

  • SimpleMappingExceptionResolver

DefaultHandlerExceptionResolver 是默认的异常处理器。

核心方法:

在这里插入图片描述

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

在这里插入图片描述

3. 自定义的异常处理器

自定义异常处理器需要使用:SimpleMappingExceptionResolver
自定义异常处理机制有两种方式:

  • 通过XML配置文件

  • 通过注解

3.1 通过 XML 配置文件的方式

在 springmvc.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 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>

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

在这里插入图片描述

<!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 类的编写

在这里插入图片描述

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 // 标注 处理器异常方法,可以标注多个不同异常的,处理方法器。

在这里插入图片描述

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

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

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

在这里插入图片描述

相关推荐

  1. SpringMvc异常处理器(在SpringBoot也可使用)

    2024-07-17 22:58:01       29 阅读
  2. SpringMVC异常处理

    2024-07-17 22:58:01       60 阅读
  3. SpringMVC异常处理

    2024-07-17 22:58:01       37 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-17 22:58:01       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-17 22:58:01       72 阅读
  3. 在Django里面运行非项目文件

    2024-07-17 22:58:01       58 阅读
  4. Python语言-面向对象

    2024-07-17 22:58:01       69 阅读

热门阅读

  1. 如何做到思维的顺畅运行

    2024-07-17 22:58:01       20 阅读
  2. Linux下Supervisor的安装与配置

    2024-07-17 22:58:01       18 阅读
  3. 布儒斯特定律

    2024-07-17 22:58:01       17 阅读
  4. A const member function

    2024-07-17 22:58:01       22 阅读
  5. 代码随想录算法训练营第14天/优先掌握递归

    2024-07-17 22:58:01       24 阅读
  6. ES6函数部分和数组部分的小练习

    2024-07-17 22:58:01       20 阅读
  7. 学习笔记(数据库)1

    2024-07-17 22:58:01       17 阅读
  8. 后端实现图片上传本地,可采用url查看图片

    2024-07-17 22:58:01       22 阅读
  9. 总览

    总览

    2024-07-17 22:58:01      19 阅读
  10. C4D S26新功能完整列表

    2024-07-17 22:58:01       25 阅读