SpringMVC异常处理

1 概述

复制代码
SpringMVC 框架处理异常的常用方式:使用@ExceptionHandler 注解处理异常。

2 @ExceptionHandler注解和用@ControllerAdvice注解

2.1 @ExceptionHandler注解

复制代码
	使用注解@ExceptionHandler 可以将一个方法指定为异常处理方法。该注解只有一个可
选属性 value,为一个 Class<?>数组,用于指定该注解的方法所要处理的异常类,即所要匹
配的异常。
	而被注解的方法,其返回值可以是 ModelAndView、String,或 void,方法名随意,方法
参数可以是 Exception 及其子类对象、HttpServletRequest、HttpServletResponse 等。系统会
自动为这些方法参数赋值。
	对于异常处理注解的用法,也可以直接将异常处理方法注解于 Controller 之中。

2.2 @ControllerAdvice注解

复制代码
	注解@ControllerAdvice,字面理解就是"控制器增强",是给控制器对象增强
功能的。使用@ControllerAdvice 修饰的类中可以使用@ExceptionHandler。
	当使用@RequestMapping 注解修饰的方法抛出异常时,会执行@ControllerAdvice 修饰的
类中的异常处理方法。@ControllerAdvice 是使用@Component 注解修饰的,可以<context:component-scan>
扫描到@ControllerAdvice 所在的类路径(包名),创建对象。

3.实战演示

复制代码
(1)定义异常类
	定义三个异常类:NameException、AgeException、MyUserException。其中 MyUserException
是另外两个异常的父类。

MyUserException

java 复制代码
public class MyUserException extends Exception{

    public MyUserException() {
        super();
    }

    public MyUserException(String message) {
        super(message);
    }
}

AgeException

java 复制代码
public class AgeException extends MyUserException{

    public AgeException() {
    }

    public AgeException(String message) {
        super(message);
    }
}

NameException

java 复制代码
public class NameException extends MyUserException{
    public NameException() {
    }

    public NameException(String message) {
        super(message);
    }
}
复制代码
(2)定义异常响应页面

ageErrorPage

html 复制代码
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>ageException</title>
</head>
<body>
ageErrorPage<br>
<hr>
${ex.message}
</body>
</html>

nameErrorPage

html 复制代码
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>nameError</title>
</head>
<body>
nameErrorPage<br>
<hr>
${ex.message}
</body>
</html>

defaultErrorPage

html 复制代码
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>defaultPage</title>
</head>
<body>
defaultErrorPage<br>
<hr>
${ex.message}
</body>
</html>
复制代码
(3)前端页面代码
html 复制代码
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
    String path = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + request.getContextPath() + "/";
%>
<html>
<head>
    <title>主页</title>
    <base href="<%=path%>">
</head>
<body>
<form action="some.do" method="post">
    姓名:<input type="text" name="name"><br>
    年龄:<input type="text" name="age"><br>
    <input type="submit" value="提交">
</form>
</body>
</html>
复制代码
(4)控制器代码
java 复制代码
@Controller
public class MyController {

    @RequestMapping(value = "/some.do",method = RequestMethod.POST)
    public ModelAndView testException(String name,Integer age) throws NameException, AgeException {
        ModelAndView mv = new ModelAndView();
        if (!"zs".equals(name)){
            throw new NameException("名称不正确");
        }
        if (age != 18){
            throw new AgeException("年龄不正确");
        }

        mv.addObject("name",name);
        mv.addObject("age",age);
        mv.setViewName("show");
        return mv;
    }
}
复制代码
(5)全局异常处理类代码
java 复制代码
/**
 * @ControllerAdvice
 * 处理器类发生异常可以到该类中寻找@ExceptionHandler
 */

@ControllerAdvice
public class GlobalExceptionResolver {

    @ExceptionHandler(NameException.class)
    public ModelAndView nameExceptionResolver(NameException nameException){
        ModelAndView mv = new ModelAndView();
        mv.addObject("ex",nameException);
        mv.setViewName("nameException");
        return mv;
    }

    @ExceptionHandler(AgeException.class)
    public ModelAndView ageExceptionResolver(AgeException ageException){
        ModelAndView mv = new ModelAndView();
        mv.addObject("ex",ageException);
        mv.setViewName("ageException");
        return mv;
    }

    @ExceptionHandler
    public ModelAndView defaultExceptionResolver(Exception exception){
        ModelAndView mv = new ModelAndView();
        mv.addObject("ex",exception);
        mv.setViewName("defaultException");
        return mv;
    }

}
复制代码
(6)配置文件disPatcher类代码
java 复制代码
<?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: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/context https://www.springframework.org/schema/context/spring-context.xsd">

    <context:component-scan base-package="com.hkd.springmvc.controller"/>

    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/view/"/>
        <property name="suffix" value=".jsp"/>
    </bean>

</beans>

(7)测试1

测试2

容易忽视的点

@ControllerAdvice 是使用@Component 注解修饰的,可以< context:component-scan>

扫描到@ControllerAdvice 所在的类路径(包名),创建对象。

相关推荐
我真会写代码14 分钟前
SSM(指南一)---Maven项目管理从入门到精通|高质量实操指南
java·spring·tomcat·maven·ssm
vx_Biye_Design15 分钟前
【关注可免费领取源码】房屋出租系统的设计与实现--毕设附源码40805
java·spring boot·spring·spring cloud·servlet·eclipse·课程设计
MSTcheng.2 小时前
探索昇腾底层逻辑:从ops-nn视角解读aclnn两阶段设计理念
mvc
独断万古他化3 小时前
【SSM开发实战:博客系统】(三)核心业务功能开发与安全加密实现
spring boot·spring·mybatis·博客系统·加密
若鱼19194 小时前
SpringBoot4.0新特性-Observability让生产环境更易于观测
java·spring
跳动的梦想家h4 小时前
环境配置 + AI 提效双管齐下
java·vue.js·spring
独断万古他化5 小时前
【Spring 原理】Bean 的作用域与生命周期
java·后端·spring
vx1_Biye_Design6 小时前
基于Spring Boot+Vue的学生管理系统设计与实现-计算机毕业设计源码46223
java·vue.js·spring boot·spring·eclipse·tomcat·maven
Hx_Ma166 小时前
SpringBoot数据源自动管理
java·spring boot·spring
java1234_小锋7 小时前
Java高频面试题:Spring和SpringBoot的关系和区别?
java·spring boot·spring