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

通过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. [swustoj 585] 倒金字塔

    倒金字塔(0585) Time limit(ms): 3000 Memory limit(kb): 65535 Submission: 208 Accepted: 48   Description S ...

  2. 点这里进入ABP系列文章总目录

    基于DDD的现代ASP.NET开发框架--ABP系列之1.ABP总体介绍 ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)”的简称. ASP.NET Boi ...

  3. http://www.cnblogs.com/eye-like/p/4121219.html

    c# 操作Word总结 在医疗管理系统中为保存患者的体检和治疗记录,方便以后的医生或其他人查看.当把数据保存到数据库中,需要新建很多的字段,而且操作很繁琐,于是想到网页的信息创建到一个word文本中, ...

  4. ActiveX添加测试工程, 出现的问题[非选择性参数][找不到成员]

    ActiveX 添加测试工程 1.新建工程MFC application, 2.添加完毕,在main Dialog中, 右键[Insert Activex Control],选择你的ActiveX控件 ...

  5. SQL Server查询性能优化——创建索引原则(一)

    索引是什么?索引是提高查询性能的一个重要工具,索引就是把查询语句所需要的少量数据添加到索引分页中,这样访问数据时只要访问少数索引的分页 就可以.但是索引对于提高查询性能也不是万能的,也不是建立越多的索 ...

  6. Velocity资源

    这里有非常多的资源和示例提供给程序员,我们推荐您查阅我们提供的示例.文档和源代码.下面是一些非常有用的资源列表: 用户和开发者社区:可以通过mail-lists加入我们.mail-lists网页地址: ...

  7. Unity3d 粒子工具注释

    今天群里有人问到瀑布粒子如何调整尺寸. 我查到ellipsoid可以调节产生粒子的空间范围,然后还需要调节粒子的长度.他那个瀑布太长了.max energy和min energy这两个参数可以用来控制 ...

  8. 察看so文件的依赖关系

    使用arm-linux-androideabi-readelf 察看依赖动态库 /android-ndk-r8d/toolchains/arm-linux-androideabi-4.7/prebui ...

  9. 【CSS3】Advanced6:Attribute Selectors

    1.with the attribute abbr[title]{color:red} 2.with the attribute and it's value input[type=text][dis ...

  10. 【Java基础】Java内部类

    什么是内部类 把类定义在其他类的内部,这个类就被称为内部类. 内部类的分类 内部类分为两种,分别为成员内部类和局部内部类: 成员内部类:和成员变量和成员方法定义在同级 局部内部类:和局部变量定义在同级 ...