我们经常需要统一配置项目的异常处理,又希望统一处理异常代码,同时不侵入原有的正常代码。我们可以通过以下三种方式实现统一处理项目的自定义异常。

通过SimpleMappingExceptionResolver类实现自定义异常的统一处理

通过实现比较简单,只需要进行bean配置即可

<!-- 对模型视图名称的解析,即在模型视图名称添加前后缀  -->
<bean id="jspViewResolver"class="org.springframework.web.servlet.view.InternalResourceViewResolver" p:prefix="/WEB-INF/exception" p:suffix=".jsp"></bean> <!-- 配置SimpleMappingExceptionResolver异常处理-->
<bean name="exceptionResolver"  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="com.myproject.frame.exception.NotLoginException">login</prop>
<prop key="java.lang.Exception">errorPage</prop>
</props>
</property>
</bean>

这种方式简单并且具有良好的扩展性,对现有代码没有侵入性,但是除了异常信息外,无法接收其他的额外的参数信息。

特别说明:errorPage.jsp和login.jsp的存放目录必须在/WEB-INF/exception目录中。模型视图路径必须与异常提示文件的存放路径保持一致。

通过 实现HandlerExceptionResolver接口实现自定义异常的统一处理

  • 首先配置bean,支持模型视图的解析
<!-- 对模型视图名称的解析,即在模型视图名称添加前后缀  -->
<bean id="jspViewResolver"class="org.springframework.web.servlet.view.InternalResourceViewResolver" p:prefix="/WEB-INF/" p:suffix=".jsp"></bean>
  • 实现HandlerExceptionResolver接口
public class ProjectExceptionHandler implements HandlerExceptionResolver {
public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
/*定义model传输model到页面*/
Map<String, Object> model = new HashMap<String, Object>();
model.put("ex", ex);
return new ModelAndView("error", model);
}
}

ex为我们自定义的异常处理类,我们自定义一个ProjectException类

public class ProjectException extends RuntimeException {
/** serialVersionUID */
private static final long serialVersionUID = 2332608236621015980L;     public ProjectException () {
     super();
   }     public ProjectException (String message) {
     super(message);
    }
}

当我们在代码异常地方抛出异常时系统自动讲异常显示到自定义的异常页面

       throw new ProjectException("自定义异常页面"); 

采用这种方式不仅具有SimpleMappingExceptionResolver所有的有点,同时还可以额外传递参数。

通过Spring的@ExceptionHandler注解实现异常统一处理

看下面一个使用@ExceptionHandler 实现一个异常处理类

public class ExceptionController {
/** 基于@ExceptionHandler异常处理 */
@ExceptionHandler
public String exp(HttpServletRequest request, Exception ex) {
/*要输出的异常参数*/
request.setAttribute("ex", ex);
return "error";
}
}

使用@ExceptionHandler 实现异常统一处理的方式简单,可扩展性强,只需要实现一个类似控制器的类,就可以了,不需要额外spring配置,但是这种方式有一个缺点是必须讲该类放在抛出异常的类同一个目录下,否则无法起作用,不够灵活,同时对于其他具有倾入性,对可能出现异常的地方需要继承该类(ExceptionController )。

异常提示的jsp文件路径

定义异常jsp文件的路径,如果要放在web-inf外面

   <prop key="com.rrtong.frame.exception.GuideTestException">../../exception/error-interface</prop>

Spring MVC的异常统一处理方法的更多相关文章

  1. Spring MVC 处理异常的3种方式

    使用Spring MVC开发的博客网站时,遇到了如何处理业务层抛出的异常的问题,查阅到了spring官方博客-spring MVC中异常的处理,以下将会以登录模块为示例. 愚蠢的处理方式 处理异常遵循 ...

  2. Spring MVC处理异常的4种方式

    http://blog.csdn.net/ufo2910628/article/details/40399539 http://my.oschina.net/CandyDesire/blog/3333 ...

  3. Spring MVC 跳转页面的方法

    转一个Spring MVC 跳转页面的方法,楼主总结的很全面,留着备用. https://blog.csdn.net/c_royi/article/details/78528758

  4. Spring MVC全局异常后返回JSON异常数据

    问题: 当前项目是作为手机APP后台支持,使用spring mvc + mybaits + shiro进行开发.后台服务与手机端交互是发送JSON数据.如果后台发生异常,会直接返回异常页面,显示异常内 ...

  5. Spring mvc 简单异常配置jsp页面

    原文出处:http://howtodoinjava.com/spring/spring-mvc/spring-mvc-simplemappingexceptionresolver-example/ 这 ...

  6. Spring MVC学习之三:处理方法返回值的可选类型

    http://flyer2010.iteye.com/blog/1294400 ———————————————————————————————————————————————————————————— ...

  7. Spring mvc接受集合类型参数的方法

    public String xxxxx(String xxxx, String xxxxx, @RequestParam("parameterList[]") List<St ...

  8. spring boot 拦截异常 统一处理

    spring boot 默认情况下会映射到 /error 进行异常处理,提示不友好,需要自定义异常处理,提供友好展示 1.自定义异常类(spring 对于 RuntimeException 异常才会进 ...

  9. Spring boot异常统一处理方法:@ControllerAdvice注解的使用、全局异常捕获、自定义异常捕获

    一.全局异常 1.首先创建异常处理包和类 2.使用@ControllerAdvice注解,全局捕获异常类,只要作用在@RequestMapping上,所有的异常都会被捕获 package com.ex ...

随机推荐

  1. MailSystem.NET Gmail IMAP讀取信件

    程式的主流程為: 開啟SSL連線,逐一讀取收信匣中的信件,將信件內文HTML及附檔逐一存檔後,再將信件移至垃圾桶. 程式碼如下,補充說明我寫在註解裡,請參考: static void Main(str ...

  2. oracle自动执行一个sql文件的脚本

    如图 文件夹 打开文件夹,如图 autoExeSyn-local.bat文件里的内容如下 @echo off -----------用户/密码-实例-------------执行的sql文件---&g ...

  3. 树莓PI安装web服务器

    参考:http://www.eeboard.com/bbs/forum.php?mod=viewthread&tid=27383 http://www.eeboard.com/bbs/thre ...

  4. Spring_Springmvc_mybatis一般配置

    web.xml配置 <?xml version="1.0" encoding="UTF-8"?><web-app xmlns:xsi=&quo ...

  5. POJ 1655 Balancing Act (求树的重心)

    求树的重心,直接当模板吧.先看POJ题目就知道重心什么意思了... 重心:删除该节点后最大连通块的节点数目最小 #include<cstdio> #include<cstring&g ...

  6. Android webView 中loadData方法加载 带中文时出现乱码

    WebView出现乱码用LoadData方法来解析html的,但是据说这是官方的一个BUG,不能用来解析中文. 采用loadDataWithBaseURL的方法,其中codeingType设置为utf ...

  7. [JSOI2008]星球大战

    正向进行很显然很BT, 所以逆向离线此题是个不错的选择. 使用并查集统计劫难之后的联通状态, 然后逐个添加结点即可. #include <stdio.h> #include <std ...

  8. java nio 快速read大文件

    If you want to make your first example faster FileChannel inChannel = new FileInputStream(fileName). ...

  9. 安装PHP出现make: *** [sapi/cli/php] Error 1 解决办法

    ext/iconv/.libs/iconv.o: In function `php_iconv_stream_filter_ctor':/home/king/php-5.2.13/ext/iconv/ ...

  10. git 秘钥的生成

    在命令查看自己的秘钥还是公钥 cat .ssh/id_rsa.pub/cat .ssh/id_rsa