spring mvc统一异常处理的3种方式(附带实例)-mile米乐体育

在 spring mvc 应用的开发中,不管是对底层数据库操作,还是业务层或控制层操作,都会不可避免地遇到各种可预知的、不可预知的异常需要处理。 如果每个过程都单独处理异常,那么系统的代码耦合度高,工作量大且不好统一,以后维护的工作量也很大。 如果能将所有类型的异常处理从各层中解耦出来,这样既保证了相关处理过程的功能单一,又实现了异常信息的统一处理和维护。 幸运的是,spring mvc 框架支持这样的实现。spring mvc 统一异常处理有以下 3 种方式:
  • 使用 spring mvc 提供的简单异常处理器 simplemappingexceptionresolver。
  • 实现 spring 的异常处理接口 handlerexceptionresolver 自定义自己的异常处理器。
  • 使用 @exceptionhandler 注解实现异常处理
本节主要根据这 3 种处理方式讲解 spring mvc 应用的异常统一处理。 为了验证 spring mvc 框架的 3 种异常处理方式的实际效果,需要开发一个测试应用 springmvcdemo10,从 dao 层、service 层、controller 层分别抛出不同的异常(sqlexception、自定义异常和未知异常),然后分别集成 3 种方式进行异常处理,进而比较其优缺点。springmvcdemo10 应用的结构如图 1 所示。 图 1springmvcdemo10应用的结构 3 种异常处理方式的相似部分有 dao 层、service 层、view 层、myexception、testexception controller 以及 web.xml,下面分别介绍这些相似部分。

1)创建应用 springmvcdemo10

创建应用 springmvcdemo10,并导入 spring mvc 相关的 jar 包。

2)创建自定义异常类

在 src 目录下创建 exception 包,并在该包中创建自定义异常类 myexception。具体代码如下:
 package exception;  public class myexception extends exception {     private static final long serialversionuid = 1l;      public myexception() {         super();     }      public myexception(string message) {         super(message);     } }

3)创建 dao 层

在 src 目录下创建 dao 包,并在该包中创建 testexceptiondao 类,在该类中定义 3 个方法,分别抛出“数据库异常”“自定义异常”和“未知异常”。具体代码如下:
 package dao; import java.sql.sqlexception; import org.springframework.stereotype.repository;  @repository("testexceptiondao") public class testexceptiondao {     public void daodb() throws exception {         throw new sqlexception("dao中数据库异常");     }      public void daomy() throws exception {         throw new sqlexception("dao中自定义异常");     }      public void daono() throws exception {         throw new sqlexception("dao中未知异常");     } }

4)创建 service 层

在 src 目录下创建 service 包,并在该包中创建 testexceptionservice 接口和 testexceptionserviceimpl 实现类,在该接口中定义 6 个方法,其中有 3 个方法调用 dao 层中的方法,有 3 个是 service 层的方法。 service 层的方法是为演示 service 层的“数据库异常”“自定义异常”和“未知异常”而定义的。 testexceptionservice 接口的代码如下:
 package service;  public interface testexceptionservice {     public void servicemy() throws exception;     public void servicedb() throws exception;     public void daomy() throws exception;     public void daodb() throws exception;     public void serviceno() throws exception;     public void daono() throws exception; }
testexceptionserviceimpl 实现类的代码如下:
 package service;  import java.sql.sqlexception;  import org.springframework.beans.factory.annotation.autowired; import org.springframework.stereotype.service;  import dao.testexceptiondao; import exception.myexception;  @service("testexceptionservice") public class testexceptionserviceimpl implements testexceptionservice {     @autowired     private testexceptiondao testexceptiondao;      @override     public void servicemy() throws exception {         throw new myexception("service中自定义异常");     }      @override     public void servicedb() throws exception {         throw new sqlexception("service中数据库异常");     }      @override     public void daomy() throws exception {         testexceptiondao.daomy();     }      @override     public void daodb() throws exception {         testexceptiondao.daodb();     }      @override     public void serviceno() throws exception {         throw new sqlexception("service中未知异常");     }      @override     public void daono() throws exception {         testexceptiondao.daono();     } }

5)创建控制器类

在 src 目录下创建 controller 包,并在该包中创建 testexceptioncontroller 控制器类,代码如下:
 package controller;  import java.sql.sqlexception;  import org.springframework.beans.factory.annotation.autowired; import org.springframework.stereotype.controller; import org.springframework.web.bind.annotation.requestmapping;  import service.testexceptionservice; import exception.myexception;  @controller public class testexceptioncontroller {     @autowired     private testexceptionservice testexceptionservice;      @requestmapping("/db")     public void db() throws exception {         throw new sqlexception("控制器中数据库异常");     }      @requestmapping("/my")     public void my() throws exception {         throw new myexception("控制器中自定义异常");     }      @requestmapping("/no")     public void no() throws exception {         throw new exception("控制器中未知异常");     }      @requestmapping("/servicedb")     public void servicedb() throws exception {         testexceptionservice.servicedb();     }      @requestmapping("/servicemy")     public void servicemy() throws exception {         testexceptionservice.servicemy();     }      @requestmapping("/serviceno")     public void serviceno() throws exception {         testexceptionservice.serviceno();     }      @requestmapping("/daodb")     public void daodb() throws exception {         testexceptionservice.daodb();     }      @requestmapping("/daomy")     public void daomy() throws exception {         testexceptionservice.daomy();     }      @requestmapping("/daono")     public void daono() throws exception {         testexceptionservice.daono();     } }

6)创建 view 层

view 层中共有 5 个 jsp 页面,下面分别介绍。 测试应用mile米乐体育首页面 index.jsp 的代码如下:
 <%@ page language="java" contenttype="text/html; charset=utf-8"     pageencoding="utf-8"%> <%@taglib prefix="spring" uri="http://www.springframework.org/tags"%>     insert title here                           


404 错误对应页面 404.jsp 的代码如下:
 <%@ page language="java" contenttype="text/html; charset=utf-8"     pageencoding="utf-8"%> <%@taglib prefix="spring" uri="http://www.springframework.org/tags"%>     insert title here       资源已不在。  
未知异常对应页面 error.jsp 的代码如下:
 <%@ page language="java" contenttype="text/html; charset=utf-8"     pageencoding="utf-8" iserrorpage="true"%> <%@taglib prefix="spring" uri="http://www.springframework.org/tags"%>     insert title here       <%=exception %>     

错误内容:

<% exception.printstacktrace(response.getwriter()); %>
自定义异常对应页面 my-error.jsp 的代码如下:
 <%@ page language="java" contenttype="text/html; charset=utf-8"     pageencoding="utf-8" iserrorpage="true"%> <%@taglib prefix="spring" uri="http://www.springframework.org/tags"%>     insert title here       <%=exception %>     

错误内容:

<% exception.printstacktrace(response.getwriter()); %>
sql 异常对应页面 sql-error.jsp 的代码如下:
 <%@ page language="java" contenttype="text/html; charset=utf-8"     pageencoding="utf-8" iserrorpage="true"%> <%@taglib prefix="spring" uri="http://www.springframework.org/tags"%>     insert title here       <%=exception %>     

错误内容:

<% exception.printstacktrace(response.getwriter()); %>

7)web.xml

对于 unchecked exception 而言,由于代码不强制捕获,往往被忽略,如果运行期产生了 unchecked exception,而代码中又没有进行相应的捕获和处理,则可能不得不面对 404、500 等服务器内部错误提示页面,所以在 web.xml 文件中添加了全局异常 404 处理。具体代码如下:
      404     /web-inf/jsp/404.jsp 
从上述 dao 层、service 层以及 controller 层的代码中可以看出,它们只管通过 throw 和 throws 语句抛出异常,并不处理。下面分别从 3 种方式统一处理这些异常。 由于篇幅有限,分成 3 节对这 3 种方式进行详细讲解,点击下面链接进行阅读:
  • spring mvc使用simplemappingexceptionresolver类异常处理
  • spring mvc使用handlerexceptionresolver接口异常处理
  • spring mvc使用@exceptionhandler注解异常处理
展开全文
内容来源于互联网和用户投稿,文章中一旦含有米乐app官网登录的联系方式务必识别真假,本站仅做信息展示不承担任何相关责任,如有侵权或涉及法律问题请联系米乐app官网登录删除

最新文章

网站地图