Spring3.0中对异常的处理方法一共提供了两种:一种是使用HandlerExceptionResolver接口;一种是在Controller类内部使用@ExceptionHandler注解。使用第一种方式可以实现全局异常控制,并且Spring已经提供了一个默认的实现类SimpleMappingExceptionResolver;使用第二种方式可以在Controller内部实现更个性化点异常处理方式,灵活性更高。一般来说,项目中只需要采用第一种方式就可以了,每个人都自己定义异常的展现方式,太过个性了,不统一。(我自己觉得配置SimpleMappingExceptionResolver比较方便)
基于HandlerExceptionResolver接口的异常处理:
使用这种方式只需要实现resolveException方法,该方法返回一个ModelAndView对象,在方法内部对异常的类型进行判断,然后常见合适的ModelAndView对象,如果该方法返回了null,则Spring会继续寻找其他的实现了HandlerExceptionResolver 接口的Bean。换句话说,Spring会搜索所有注册在其环境中的实现了HandlerExceptionResolver接口的Bean,逐个执行,直到返回了一个ModelAndView对象。
示例代码:
- /**
- * 基于HandlerExceptionResolver接口的异常处理类
- * @author ZYWANG 2011-4-2
- */
- public class CustomExceptionHandler implements HandlerExceptionResolver {
- @Override
- public ModelAndView resolveException(HttpServletRequest request,
- HttpServletResponse response, Object object, Exception exception) {
- if(exception instanceof IOException){
- return new ModelAndView("errors/ioException");
- }else if(exception instanceof SQLException){
- return new ModelAndView("errors/sqlException");
- }
- return null;
- }
- }
这个类必须声明到Spring中去,让Spring管理它,你可以使用@Component标签,也可以使用<bean/>节点。(这就是spring的灵活性支持自己扩展)
为了简单的进行异常处理,Spring提供了SimpleMappingExceptionResolver类,该类实现了HandlerExceptionResolver接口,需要使用时只需要使用<bean/>节点进行声明即可,示例如下:
<bean id="exceptionResolver" class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<property name="exceptionMappings">
<props>
<prop key="java.lang.Exception">errors/webException</prop>
<prop key="java.lang.Throwable">errors/rmsException</prop>
</props>
</property>
<property name="statusCodes">
<props>
<prop key="errors/webException">500</prop>
<prop key="errors/rmsException">404</prop>
</props>
</property>
<!-- 设置日志输出级别,不定义则默认不输出警告等错误日志信息 -->
<property name="warnLogCategory" value="WARN"></property>
<!-- 默认错误页面,当找不到上面mappings中指定的异常对应视图时,使用本默认配置 -->
<property name="defaultErrorView" value="errors/error"></property>
<!-- 默认HTTP状态码 -->
<property name="defaultStatusCode" value="500"></property>
</bean>
<!-- 全局异常配置 end -->
一个典型的异常显示页面如下:
<html>
<head><title>Exception!</title></head>
<body>
<% Exception ex = (Exception)request.getAttribute("exception"); %>
<H2>Exception: <%= ex.getMessage();%></H2>
<P/>
<% ex.printStackTrace(new java.io.PrintWriter(out)); %>
</body>
</html>
exception 实在SimpleMappingExceptionResolver 被存放到request中的,具体可以查看源代码。
如果SimpleMappingExceptionResolver无法满足异常处理的需要,我们可以针对
HandlerExceptionResolver接口实现自己异常处理类,这同样非常简单(只需要实现一个
resolveException方法)。
如果有ViewResolver,则制定的jsp页面必须在那个页面下,到时候如果找不到页面,可以根据错误提示再调整页面路径
基于@ExceptionHandler的异常处理:
该方法需要定义在Controller内部,然后创建一个方法并用@ExceptionHandler注解来修饰用来处理异常,这个方法基本和 @RequestMapping修饰的方法差不多,只是可以多一个类型为Exception的参数,@ExceptionHandler中可以添加一个或多个异常的类型,如果为空的话则认为可以触发所有的异常类型错误。
示例代码:
- /**
- * 基于@ExceptionHandler异常处理
- * @author ZYWANG 2011-4-2
- */
- @Controller
- public class ExceptionHandlerController {
- @ExceptionHandler(value={IOException.class,SQLException.class})
- public String exp(Exception ex,HttpServletRequest request) {
- request.setAttribute("exception", ex);
- return "/error.jsp";
- }
- }
相关推荐
通过aop拦截获取json请求数据,对数据进行处理判断,如果不合法则抛出异常,配置全局异常处理类,在异常处理类中直接将处理结果返回调用处,减少每次在方法中解析json数据然后在判断,减少代码冗余
SSM笔记-SpringMVC的异常处理,包含了ExceptionHandler注解、ResponseStatusExceptionResolver、DefaultHandlerExceptionResolver、SimpleMappingExceptionResolver的使用和试验
十一、spring mvc 如何实现全局的异常处理? 十二、spring mvc 如何把全局异常记录到日志中? 十三、如何给spring3 MVC中的Action做JUnit单元测试? 十四、spring mvc 转发与重定向 十五、spring mvc 处理ajax请求...
十一、 spring mvc 如何实现全局的异常处理 十二、 spring mvc 如何把全局异常记录到日志中 十三、 如何给spring3 MVC中的Action做JUnit单元测试 十四、 spring mvc 转发与重定向 (带参数重定向) 十五、 spring ...
业余时间,整合以前项目技术,创建springMVC示例,目前升级到4.3.13版本,您的宝贵意见,是我们进步的动力。...- 配置全局异常处理,mybatis,pagehelper分页。 - 配置通用日志打印,采用异步线程池日志写入
对各种不同异常进行了全局统一处理 使用lombok简化java代码,让源码更简洁,可读性高 mybatis未进行二次封装,原滋原味,简单sql采用注解,复杂sql采用Mapper.xml配置 使用了layui的弹出层、菜单、文件上传、富...
本项目使用了SpringBoot集成SSM,为所有Spring开发者更快的入门, 开箱即用,提供各种默认...SpringMVC是控制层 ,内置了全局异常捕捉功能,出现异常时可统一进行处理, 在实体类方面使用的是lombok简化冗余代码。
十一、spring mvc 如何实现全局的异常处理? 十二、spring mvc 如何把全局异常记录到日志中? 十三、如何给spring3 MVC中的Action做JUnit单元测试? 十四、spring mvc 转发与重定向 十五、spring mvc 处理ajax请求 ...
6.扩展SpringMVC功能、全局异常处理 7.注册Servlet组件、配置外部的Servlet容器 8.SpringBoot数据访问(JDBC、MyBatis、Mybatis-Plus) 9.SpringBoot整合Redis 教学全程采用笔记+代码案例的形式讲解,通俗易懂!!!
十一、spring mvc 如何实现全局的异常处理? 十二、spring mvc 如何把全局异常记录到日志中? 十三、如何给spring3 MVC中的Action做JUnit单元测试? 十四、spring mvc 转发与重定向 十五、spring mvc 处理ajax请求 ...
05、框架实现了文件上传共通、电子文档导出、校验、全局异常处理、分页等共通,具体参见相关画面的相关功能; 06、通过注解方式实现事务控制,相关画面有测试代码,具体在哪可以自己找一下; 07、关于数据库链接,...
提供统一的异常处理机制 提供access_token自动更新机制 请求消息组装 灵活的响应消息类型 二、快速入门 本章教材提供一个最简单的例子,用户在微信公众号发一条foo的文本请求消息,公众号响应一条bar的文本响应消息...
day07_solr集群搭建_全局异常处理 day08_activeMQ介绍_搭建_解决同步索引库问题 day09_FreeMark入门_静态化页面标签介绍_静态化页面实现 day10_Nginx代理详解..单点登录系统工程搭建_接口文档讲解 day11_单点...
3.5、全局捕获异常 10 四、 数据访问 10 4.1、springboot整合使用JdbcTemplate 10 4.2、springboot整合使用mybatis 12 4.3、springboot整合使用springjpa 18 4.4、springboot整合多数据源 19 五、 事物管理 25...
异常邮件监控:全局拦截系统异常,并发送通知邮件。 单点登录:使用shior和Redis、共享session方式实现单点登录。 Redis分布式高速缓存:代码生成直接生成Redis对接代码。 特性: JeeSpringCloud基于SpringBoot+...
异常邮件监控:全局拦截系统异常,并发送通知邮件。 单点登录:使用shior和Redis、共享session方式实现单点登录。 Redis分布式高速缓存:代码生成直接生成Redis对接代码。 特性: JeeSpringCloud基于SpringBoot+...
异常邮件监控:全局拦截系统异常,并发送通知邮件。单点登录:使用shior和Redis、共享session方式实现单点登录。Redis分布式高速缓存:代码生成直接生成Redis对接代码。特性:JeeSpringCloud基于SpringBoot+SpringMVC+...