1. 概述
SpringMVC 提供的异常处理主要有两种方式:
- 一种是直接实现自己的HandlerExceptionResolver
- 一种是使用注解
通过注解的方式实现处理异常主要有以下两种方式:
- 1 @ControllerAdvice+@ExceptionHandler:配置对全局异常进行处理
- 2 @Controller + @ExceptionHandler:配置对当前所在Controller的异常进行处理
在SpringMVC中,处理异常类实际上是HandlerExceptionResolver子类。HandlerExceptionResolver处理所有controller类在执行过程中抛出的未被处理的异常。
本文演示如何使用以上多种处理异常的方式,最后演示以不同的方式将异常结果返回给调用者
- 返回 modelAndView
- 返回一个页面的地址
- 返回 JSON
- 返回 http 错误码
2. 演示工程mvc
所有代码都中mvc工程中
3.1. 基础类和JSP页面
辅助类
EmployeeEx:POJO类
ExceptionJSONInfo:封装返回的JSON对象
public class EmployeeEx {
private String name;
private int id;
…
}
public class ExceptionJSONInfo {
private String url;
private String message;
…
}
定义测试的异常类
EmployeeExNotFoundException
public class EmployeeExNotFoundException extends Exception {
private static final long serialVersionUID = -3332292346834265371L;
public EmployeeExNotFoundException(int id){
super("EmployeeNotFoundException with id="+id);
}
}
EmployeeExJsonException
public class EmployeeExJsonException extends Exception {
private static final long serialVersionUID = -3332292346834265371L;
public EmployeeExJsonException(int id){
super("EmployeeExJsonException with id="+id);
}
}
JSP页面
本demo使用的jsp都在此“META-INF.resources.WEB-INF.page.exceptionhandling”目录下,由于代码简单,这里一一列出。
3. 通过注解的方式捕获异常
本节演示两种通过注解捕获异常的方式
- @Controller + @ExceptionHandler
- @ControllerAdvice + @ExceptionHandler
3.1. @Controller + @ExceptionHandler
@Controller:注解此类是Controller类
@ExceptionHandler:此注解注解到类的方法上,当此注解里定义的异常抛出时,此方法会被执行。如果@ExceptionHandler所在的类是@Controller,则此方法只作用在此类。如果@ExceptionHandler所在的类是@ControllerAdvice,则此方法会作用在全局。本节演示前种用法
下面演示这种用法:
EmployeeExController:
- 在@Controller里定义的@ExceptionHandler只截获所在类抛出的异常
- handleEmployeeNotFoundException()通过@ExceptionHandler定义要捕获的异常是EmployeeExNotFoundExc