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

通过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. bzoj1084

    乍一看这题好难,根本不会: 直到看到1<=m<=2…… 显然分类讨论dp, 很快想到这题的dp和poj2430相类似 m=2的时候f[i,j,k]表示到第i行用了j个矩阵结尾状态为k时最大 ...

  2. ☀【组件】字符串 string

    <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="utf-8& ...

  3. hunnu 小明的烦恼——找字符串

    http://acm.hunnu.edu.cn/online/?action=problem&type=show&id=11544&courseid=0 小明的烦恼——找字符串 ...

  4. javascript 关于cookie的操作

    <script language=javascript> //获得coolie 的值 function cookie(name){ var cookieArray=document.coo ...

  5. 浅谈PetShop之使用存储过程与PLSQL批量处理(附案例)

    1       大概思路 备注:黄色为影响参数 2       PetShop4的经典数据库连接代码回顾 PetShop4有3个函数,具体有: ExecuteReader:可以读一个表的记录,只能读不 ...

  6. CodeBlocks+opencv2.4.4+cmake+MinGW

    /*-----------------------------------------------------------------------------*   *   版权声明:*   可以任意 ...

  7. JZ2440开发笔记(2)——minicom的安装和配置使用【转】

    一.安装配置minicom 1.安装minicom lingd@ubuntu:~$ sudo apt-get install minicom 2.配置minicom lingd@ubuntu:~$ s ...

  8. 关于 Lua 内存泄漏的检测

    前一阵开始和同事一起优化内存,首先是优化 Lua 内存,因为发现每次战斗完后 Lua 内存非常大,从 3M 左右在经过了10次左右的战斗后,会暴增到近 100M,很明显是有内存泄漏.      然后我 ...

  9. 【JS】Intermediate2:Events and Callbacks

    event-driven :waiting for and reacting to events 2.page loads, user interacts (clicks, hovers, chang ...

  10. J2EE开发常用开源框架技术(转)

    主要就我所了解的J2EE开发的框架或开源项目做个介绍,可以根据需求选用适当的开源组件进行开发.主要还是以Spring为核心,也总结了一些以前web开发常用的开源工具和开源类库 1持久层:1)Hiber ...