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

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

相关推荐
~kiss~1 分钟前
Rust~二刷异步逻辑
开发语言·后端·rust
菠菠萝宝4 分钟前
【Java八股文】11-分布式及场景面试篇
java·分布式·面试·k8s·系统·uuid·mq
SomeB1oody10 分钟前
【Rust中级教程】2.7. API设计原则之灵活性(flexible) Pt.3:借用 vs. 拥有、`Cow`类型、可失败和阻塞的析构函数及解决办法
开发语言·后端·性能优化·rust
LUCIAZZZ12 分钟前
Https解决了Http的哪些问题
java·网络·网络协议·spring·http·rpc·https
larance19 分钟前
Flask 发送邮件
后端·python·flask
Aska_Lv24 分钟前
从零到一写组件库-日志组件库
后端
论迹33 分钟前
【JavaEE】-- 多线程(初阶)2
java·开发语言·java-ee
桃子是唯一的水果42 分钟前
java 单例模式(Lazy Initialization)实现遍历文件夹下所有excel文件且返回其运行时间
java·单例模式·maven
+72043 分钟前
如何在java中用httpclient实现rpc post 请求
java·开发语言·rpc
ybq195133454311 小时前
javaEE-SpringBoot日志
java·spring boot·后端