返回顶部
分享到

SpringMVC统一异常处理三种方法的介绍

数据库其他 来源:互联网搜集 作者:秩名 发布时间:2020-04-17 21:09:54 人浏览
摘要

在 Spring MVC 应用的开发中,不管是对底层数据库操作,还是业务层或控制层操作,都会不可避免地遇到各种可预知的、不可预知的异常需要处理。 如果每个过程都单独处理异常,那么系统的代码耦合度高,工作量大且不好统一,以后维护的工作量也很大。 如果能将

在 Spring MVC 应用的开发中,不管是对底层数据库操作,还是业务层或控制层操作,都会不可避免地遇到各种可预知的、不可预知的异常需要处理。

如果每个过程都单独处理异常,那么系统的代码耦合度高,工作量大且不好统一,以后维护的工作量也很大。

如果能将所有类型的异常处理从各层中解耦出来,这样既保证了相关处理过程的功能单一,又实现了异常信息的统一处理和维护。

幸运的是,Spring MVC 框架支持这样的实现。Spring MVC 统一异常处理有以下 3 种方式:

  • 使用 Spring MVC 提供的简单异常处理器 SimpleMappingExceptionResolver。
  • 实现 Spring 的异常处理接口 HandlerExceptionResolver 自定义自己的异常处理器。
  • 使用 @ExceptionHandler 注解实现异常处理

本节主要根据这 3 种处理方式讲解 Spring MVC 应用的异常统一处理。

Spring MVC使用SimpleMappingExceptionResolver类异常处理

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
<?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
    http://www.springframework.org/schema/context/spring-context.xsd">
  <!-- 使用扫描机制扫描包 -->
  <context:component-scan base-package="controller" />
  <context:component-scan base-package="service" />
  <context:component-scan base-package="dao" />
  <!-- 配置视图解析器 -->
  <bean
    class="org.springframework.web.servlet.view.InternalResourceViewResolver"
    id="internalResourceViewResolver">
    <!--前缀 -->
    <property name="prefix" value="/WEB-INF/jsp/" />
    <!-- 后缀 -->
    <property name="suffix" value=".jsp" />
  </bean>
  <!--SimpleMappingExceptionResolver(异常类与 View 的对应关系) -->
  <bean
    class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
    <!-- 定义默认的异常处理页面,当该异常类型注册时使用 -->
    <property name="defaultErrorView" value="error"></property>
    <!-- 定义异常处理页面用来获取异常信息的变量名,默认名为exception -->
    <property name="exceptionAttribute" value="ex"></property>
    <!-- 定义需要特殊处理的异常,用类名或完全路径名作为key,异常页名作为值 -->
    <property name="exceptionMappings">
      <props>
        <prop key="exception.MyException">my-error</prop>
        <prop key="java.sql.SQLException">sql-error</prop>
        <!-- 在这里还可以继续扩展对不同异常类型的处理 -->
      </props>
    </property>
  </bean>
</beans>
 

Spring MVC使用HandlerExceptionResolver接口异常处理

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package exception;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView;
public class MyExceptionHandler implements HandlerExceptionResolver {
  @Override
  public ModelAndView resolveException(HttpServletRequest arg0,
      HttpServletResponse arg1, Object arg2, Exception arg3) {
    Map<String, Object> model = new HashMap<String, Object>();
    model.put("ex", arg3);
    // 根据不同错误转向不同页面(统一处理),即异常与View的对应关系
    if (arg3 instanceof MyException) {
      return new ModelAndView("my-error", model);
    } else if (arg3 instanceof SQLException) {
      return new ModelAndView("sql-error", model);
    } else {
      return new ModelAndView("error", model);
    }
  }
}
 
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?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
    http://www.springframework.org/schema/context/spring-context.xsd">
  <!-- 使用扫描机制扫描包 -->
  <context:component-scan base-package="controller" />
  <context:component-scan base-package="service" />
  <context:component-scan base-package="dao" />
  <!-- 配置视图解析器 -->
  <bean
    class="org.springframework.web.servlet.view.InternalResourceViewResolver"
    id="internalResourceViewResolver">
    <!--前缀 -->
    <property name="prefix" value="/WEB-INF/jsp/" />
    <!-- 后缀 -->
    <property name="suffix" value=".jsp" />
  </bean>
  <!--托管MyExceptionHandler-->
  <bean class="exception.MyExceptionHandler"/>
</beans>
 

Spring MVC使用@ExceptionHandler注解异常处理

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package controller;
import java.sql.SQLException;
import javax.servlet.http.HttpServletRequest;
import org.springframework.web.bind.annotation.ExceptionHandler;
import exception.MyException;
public class BaseController {
  /** 基于@ExceptionHandler异常处理 */
  @ExceptionHandler
  public String exception(HttpServletRequest request, Exception ex) {
    request.setAttribute("ex", ex);
    // 根据不同错误转向不同页面,即异常与view的对应关系
    if (ex instanceof SQLException) {
      return "sql-error";
    } else if (ex instanceof MyException) {
      return "my-error";
    } else {
      return "error";
    }
  }
}
 
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?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
    http://www.springframework.org/schema/context/spring-context.xsd">
  <!-- 使用扫描机制扫描包 -->
  <context:component-scan base-package="controller" />
  <context:component-scan base-package="service" />
  <context:component-scan base-package="dao" />
  <!-- 配置视图解析器 -->
  <bean
    class="org.springframework.web.servlet.view.InternalResourceViewResolver"
    id="internalResourceViewResolver">
    <!--前缀 -->
    <property name="prefix" value="/WEB-INF/jsp/" />
    <!-- 后缀 -->
    <property name="suffix" value=".jsp" />
  </bean>
</beans>


版权声明 : 本文内容来源于互联网或用户自行发布贡献,该文观点仅代表原作者本人。本站仅提供信息存储空间服务和不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权, 违法违规的内容, 请发送邮件至2530232025#qq.cn(#换@)举报,一经查实,本站将立刻删除。

您可能感兴趣的文章 :

原文链接 : https://www.cnblogs.com/lowerma/p/11836595.html
相关文章
  • 一文介绍在Hive中NULL的理解
    在 Hive 中,NULL 是一个特殊的值,表示未知或缺失。任何与NULL的比较操作(如=,,,=,=,)都会返回NULL,而不是TRUE或FALSE。 1.NULL 的比较规则 在
  • Navicat Premium 12数据库管理解决方案

    Navicat Premium 12数据库管理解决方案
    Navicat Premium 12是一款全面的数据库管理工具,支持多种数据库系统如MySQL、MariaDB、Oracle、SQL Server、PostgreSQL等。它提供了多数据库连接、数据
  • sqlite3命令行工具使用介绍
    一、启动与退出 启动数据库连接 1 2 3 sqlite3 [database_file] # 打开/创建数据库文件(如 test.db) sqlite3 # 启动临时内存数据库 (:memory:) sqlite3 :m
  • StarRocks简介与搭建使用介绍

    StarRocks简介与搭建使用介绍
    StarRocks简介 StarRocks 是一款高速、实时、全场景的MPP(大规模并行处理)分析型数据库系统,专为现代数据分析场景设计,强调亚秒级查询性
  • centos虚拟机部署opengauss数据库详细图文

    centos虚拟机部署opengauss数据库详细图文
    一、基本信息 1、虚拟机安装的centos版本 2、opengauss版本 地址:https://opengauss.org/zh/download/ 3、opengauss和gaussdb的区别 高斯数据库(GaussDB)是云
  • 达梦数据库文件故障的恢复方法

    达梦数据库文件故障的恢复方法
    1、概述 1.1 概述 本文介绍了达梦数据库文件损坏或误删除后的恢复方法。这里的数据库文件包括,表空间数据文件、重做日志文件、UNDO文件
  • Sql Server 2008 数据库附加错误:9004问题解决方案介
    【问题描述】 数据库文件存在异常状况,有可能是因为硬盘有坏区引起的。附加数据库的时候,提示错误9004。 【解决方法】 假设数据库名
  • Access数据中的SQL偏移注入原理解析介绍
    使用场景: 目标数据表的字段较多,无法一一获取的时候,尝试使用偏移注入的方式实现SQL注入。 原理: 例如:一个表有6个字段,而你想
  • Navicat导入Excel数据时数据被截断的问题分析与解

    Navicat导入Excel数据时数据被截断的问题分析与解
    在数据库的日常操作中,将Excel数据导入MySQL是常见的需求之一,特别是通过Navicat工具进行Excel数据导入时,可能会遇到数据截断的问题。具
  • GaussDB数据库事务管理及高级应用

    GaussDB数据库事务管理及高级应用
    事务管理是数据库系统中至关重要的一部分,它确保了数据库的一致性和可靠性。在GaussDB数据库中,事务管理不仅遵循传统的ACID特性,还提
  • 本站所有内容来源于互联网或用户自行发布,本站仅提供信息存储空间服务,不拥有版权,不承担法律责任。如有侵犯您的权益,请您联系站长处理!
  • Copyright © 2017-2022 F11.CN All Rights Reserved. F11站长开发者网 版权所有 | 苏ICP备2022031554号-1 | 51LA统计