前言:本篇主要介绍SpringMVC的数据绑定流程中数据校验的相关概念与用法。
Spring MVC 通过HandlerExceptionResolver处理程序的异常,包括 Handler 映射、数据绑定以及目标方法执行时发生的异常。测试页面如下:
1. HandlerExceptionResolver的实现类
DispatcherServlet 会默认装配HandlerExceptionResolver实现类:
若没有使用 <mvc:annotation-driven/> 配置:
- AnnotationMethodHandlerExceptionResolver(已过时);
- ResponseStatusExceptionResolver;
- DefaultHandlerExceptionResolver;
若使用 <mvc:annotation-driven/> 配置:
- ExceptionHandlerExceptionResolver;
- ResponseStatusExceptionResolver;
- DefaultHandlerExceptionResolver;
使用SpringMVC作为MVC框架时,一般都需要配置<mvc:annotation-driven/>,ExceptionHandlerExceptionResolver也是主要处理Hander中异常的主要手段。
2. ExceptionHandlerExceptionResolver
ExceptionHandlerExceptionResolver主要处理控制器Handler中用@ExceptionHandler注解定义的方法。
@ExceptionHandler 注解定义的方法优先级问题:例如. 发生的是NullPointerException,但是声明的异常有RuntimeException 和 Exception,此候会根据异常的最近继承关系找到继承深度最浅的那个@ExceptionHandler注解方法,即标记了 RuntimeException 的方法。
ExceptionHandlerMethodResolver内部若找不到@ExceptionHandler注解的方法,会全局找@ControllerAdvice中的@ExceptionHandler方法。
后台测试代码:
@RequestMapping("/testExceptionHandlerExceptionResolver.action") public String testExceptionHandlerExceptionResolver(@RequestParam("i") int i){ System.out.println("result: " + (10 / i)); // 除数为0的话会出现ArithmeticException运行时异常 return "success"; } /** * 1. 在 @ExceptionHandler 方法的入参中可以加入 Exception 类型的参数, 该参数即对应发生的异常对象 * 2. @ExceptionHandler 方法的入参中不能传入 Map. 若希望把异常信息传导页面上, 需要使用 ModelAndView 作为返回值 * 3. @ExceptionHandler 方法标记的异常有优先级的问题. * 4. @ControllerAdvice: 如果在当前 Handler 中找不到 @ExceptionHandler 方法来出来当前方法出现的异常, * 则将去 @ControllerAdvice 标记的类中查找 @ExceptionHandler 标记的方法来处理异常. */ @ExceptionHandler({ArithmeticException.class}) public ModelAndView handleArithmeticException(Exception ex){ System.out.println("【ArithmeticException】: " + ex); ModelAndView mv = new ModelAndView("error"); mv.addObject("exception", ex); return mv; } @ExceptionHandler({RuntimeException.class}) public ModelAndView handleArithmeticException2(Exception ex){ System.out.println("【RuntimeException】: " + ex); ModelAndView mv = new ModelAndView("error"); mv.addObject("exception", ex); return mv; }
如果testExceptionHandlerExceptionResolver方法抛出ArithmeticException异常,根据异常优先级,会先被handleArithmeticException方法捕获。如果上述handleArithmeticException和handleArithmeticException2异常处理方法都未定义,但在SpringMVCTestExceptionHandler类中定义异常处理,如下所示:
@ControllerAdvice public class SpringMVCTestExceptionHandler { @ExceptionHandler({ArithmeticException.class}) public ModelAndView handleArithmeticException(Exception ex){ System.out.println("【ControllerAdvice】" + ex); ModelAndView mv = new ModelAndView("error"); mv.addObject("exception", ex); return mv; } }
处理器内部若找不到@ExceptionHandler注解的方法,会全局找@ControllerAdvice中的@ExceptionHandler方法进行异常处理。
3. ResponseStatusExceptionResolver
在控制器方法上或是修饰异常类使用@ResponseStatus 注解,则ResponseStatusExceptionResolver会使用这个注解的属性进行处理。
后台测试代码:
1. 首先@ResponseStatus修饰异常处理类:
@ResponseStatus(value=HttpStatus.FORBIDDEN, reason="自定义异常") public class CustomizedException extends RuntimeException{ private static final long serialVersionUID = 1L; }
2. 然后是@ResponseStatus在控制器中修饰方法(测试中同时是功能处理方法):
@ResponseStatus(reason="测试",value=HttpStatus.NOT_FOUND) @RequestMapping("/testResponseStatusExceptionResolver.action") public String testResponseStatusExceptionResolver(@RequestParam("i") int i){ if(i == 13){ throw new CustomizedException(); } System.out.println("testResponseStatusExceptionResolver..."); return "success"; }
说明:若i == 13,则返回异常类定义的响应;若i != 13,则返回异常方法定义的响应。
3. 前台代码略,可参见附件代码
4. 测试结果
(测试的时候将ExceptionHandlerExceptionResolver对异常处理的操作去掉,以免会捕获i == 13时抛出的自定义异常!)
当i == 13时
当 i != 13时:
4. DefaultHandlerExceptionResolver
DefaultHandlerExceptionResolver对一些特殊的异常进行处理,如:
相关推荐
Maven+SpringMVC实现统一异常处理
springmvc_02 高级参数绑定 异常处理 文件上传.docx。
springmvc异常处理的博文如下: http://blog.csdn.net/dlf123321/article/details/50756003
本文档主要介绍了SpringMVC的ModelAndView机制,使用SpringMVC实现文件上传,下载以及全局异常处理机制
异常一层一层的向上抛出,但是开发人员肯定不想要用户看到代码出错,因此需要将异常屏蔽了,SpringMVC提供了异常处理的手段。
SpringMVC通过HandlerExceptionResolver接口来处理程序的异常,包括Handler映射、数据绑定和目标方法执行时发生的异常。 主要测试HandlerExceptionResolver的具体实现类的具体用法
springmvc在处理请求过程中出现异常信息交由异常处理器进行处理,自定义异常处理器可以实现一个系统的异常处理逻辑。
SpringMVC中异常处理机制,简单案例,里面有详细说明以及博客说明。
springmvc返回json的全局异常统一处理demo,有问题可以留言。
主要介绍了springmvc如何进行异常处理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
SSM笔记-SpringMVC的异常处理,包含了ExceptionHandler注解、ResponseStatusExceptionResolver、DefaultHandlerExceptionResolver、SimpleMappingExceptionResolver的使用和试验
统一异常处理会区分前端是否ajax请求,自动返回json数据格式,要求开发人员在处理ajax请求时统一封装成一个对象返回,以符合代码统一规范。 此工程在idea环境编写,导入请自己新建工程手工复制代码导入。
通过aop拦截获取json请求数据,对数据进行处理判断,如果不合法则抛出异常,配置全局异常处理类,在异常处理类中直接将处理结果返回调用处,减少每次在方法中解析json数据然后在判断,减少代码冗余
12SpringMVC异常处理.md
SpringMVC处理全局异常在使用Shiro权限控制框架后,如果使用注解在Controller控制访问的角色,如果权限不足,就会抛出Authorization
本视频针对博客内容,讲解springMVC框架中的统一异常处理的知识点和实例,以及500错误和404错误异常处理上的区别,简单易懂,言简意赅。
springMVC3学习(八)--全局的异常处理(源码) 文章地址:http://blog.csdn.net/itmyhome1990/article/details/26286435
SpringMVC入门很简单之异常处理,具体参考博文:http://www.cnblogs.com/liukemng/tag/SpringMVC/
极客学院java中级课程,SpringMVC系列教材——SpringMVC 中的拦截器与异常处理