mvc的异常解析器有以下四种
- SimpleMappingExceptionResolver:建立异常与页面之间的映射关系,即出现异常之后,跳转到指定页面
- DefaultHanlderExceptionResolver:mvc的默认实现方式。
- ResponseStatusExceptionResolver:配置异常的返回码以及日志信息。
- ExceptionHandlerExceptionResolver:建议异常与方法之间的映射关系,即出现异常之后,运行指定的方法。
1、SimpleMapping
它的概念是建立异常类型与错误页面之间的映射关系,即出错之后,跳转到指定的页面。
它有以下几个属性:
- exceptionsMapping:异常类型与页面之间的映射关系,key值为异常类型,value值为页面,它会经过ViewResolver处理。
- excludedExceptions:排除这些异常。
- defaultErrorView:若抛出的异常类型在exceptionsMapping找不到映射关系,使用默认的页面。抛出的异常类型不包含excluedExceptions中的值。
- defaultStatusCode:默认的状态码
使用步骤如下:
第一步,创建SimpleMappingExceptionResolver对象,配置上述的属性
第二步,注册。注解方式是通过重写configureHandlerExceptionResolvers方法。Xml方式是通过配置SimpleMappingExceptionResolver的bean。
测试,
第一步,创建exception.properties,建立异常与页面的映射关系。它的内容如下:
# 算术异常 java.lang.ArithmeticException = error/arithmeticException
第二步,创建SimpleMappingExceptionResolver对象,加载exception.properties文件,并配置上述属性
// 创建SimpleMappingExceptionResolver SimpleMappingExceptionResolver simple = new SimpleMappingExceptionResolver(); // 加载exception.properties Properties exceptions = new Properties(); // 添加异常与页面的映射关系 simple.setExceptionMappings(exceptions); // 排除异常,排除空指针异常 simple.setExcludedExceptions(NullPointerException.class); // 设置默认的异常跳转页面 simple.setDefaultErrorView("error/error.jsp"); // 设置默认的异常码 simple.setDefaultStatusCode(999);
第三步,注册,重写configureHandlerExceptionResolvers方法。方法的参数为HandlerExceptionResolver集合,把新创建的对象添加到集合中。
第四步,测试,在Controller方法中运行1/0,抛出算术异常,验证结果。
2、ExceptionHandler
建立异常类型与方法之间的映射关系。即出错之后,运行指定的方法。
当抛出异常之后,会在当前Controller下查找有@ExceptionHandler注解的方法。若要设置全局的, 可以配置Controller的切面。具体做法把异常处理的方法提取到公共类中,在类上添加@ControllerAdvice注解,在方法上添加@ExceptionHandler注解。@ExceptionHandler只有一个属性value,值为异常类型对应的Class类集合。
当value属性为空时,相当于默认值,会处理所有的异常。
若value值重复时,即一个exception 类型有多个方法与之对应时,抛出IllegalStateException。
当异常抛出,对应的方法执行之后,请求会被视为正常结束,返回的状态码为200。若想返回特定的响应码,可以配合@ResponseStatus注解。
它的使用步骤如下:
第一步,注入对象,查看dispatcher.properties, 它是默认注入的。
第二步,编写方法,标注@ExceptionHandler,value属性指定异常类型。
@ControllerAdvice(assignableTypes = {TestController.class,HelloController.class}) public class ExceptionController { /** * @Title: resolve * @Description:解决异常的方法 * @return */ @ExceptionHandler(value = ArithmeticException.class) public ModelAndView resolve() { return new ModelAndView("error/arithmeticException"); } }
示例中,只处理TestController和HelloController中抛出的异常
注:@ControllerAdvice相当于AOP中的advice。
3、 ResponseStatus
配置异常类型的响应码以及异常信息,若没有,Web容器会使用默认的响应码和异常信息
通过@ResponseStatus注解的code属性值配置响应码。它的值为HttpStatus枚举类型。
通过@ResponseStatus注解的reason属性值配置响应码。
它出现的方式有以下三种
添加在自定义异常的类上。添加在任何处理请求的方法上,添加在请求流程相关的方法上,例如@ExceptionHandler标注的方法上。
它是默认注入的。
4、DefaultHandler
它是mvc处理异常的默认方式。会调用response.sendError方法返回特定的响应码,异常信息。
它兼容Servlet处理异常的方式,例如在web.xml中配置/error时,会跳转到其对应的处理器。