控制层常用的SpringMVC 异常处理 方式 主要有 三 种
使用系统定义好的异常处理器 SimpleMappingExceptionResolver
使用自定义异常处理器
使用异常处理注解
SimpleMappingExceptionResolver 异常处理器
该方式只需要在 SpringMVC 配置文件中注册该异常处理器 Bean 即可。该 Bean 比较特殊,没有 id 属性,无需显式调用或被注入给其它 < bean/>,当异常发生时会自动执行该类。
准备一个异常类
public class NameException extends Exception {
public NameException(){
super();
}
public NameException(String message){
super(message);
}
}
复制
控制层方法
@Controller
@RequestMapping("/test")
public class MyController3 {
@RequestMapping("/test_exception")
public ModelAndView test_exception(String name,int age) throws NameException{
if("langlihge".equals(name)){
throw new NameException("姓名不正确");
}
return new ModelAndView("/WEB-INF/jsp/show.jsp");
}
}
复制
springMVC.xml配置
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<property name="exceptionMappings">
<props>
<prop key="com.huge.exception.NameException">nameError</prop>
</props>
</property>
<property name="defaultErrorView" value="defaultError"/>
<property name="exceptionAttribute" value="ex"/>
</bean>
复制
exceptionMappings : Properties 类型属性,用于指定具体的不同类型的异常所对应的异常响应页面。Key 为异常类的全限定性类名, value 则为响应页面路径
defaultErrorView :指定默认的异常响应页面。若发生的异常不是 exceptionMappings 中指定的异常,则使用默认异常响应页面。
exceptionAttribute :捕获到的异常对象。一般异常响应页面中使用。
在WebRoot 下新建一个目录 errors
定义两个异常处理页面nameError.jsp,defaultError.jsp
<body>
nameError.jsp<br>
错误信息:${ex.message}
</body>
复制
<body>
defaultError.jsp<br>
错误信息:${ex.message}
</body>
复制
测试
自定义异常处理器
使用SpringMVC 定义好的 SimpleMappingExceptionResolver 异常处理器,可以实现发生指定异常后的跳转。但若要实现在捕获到指定异常时,执行一些操作的目的,它是完成不了的。此时,就需要自定义异常处理器。
自定义异常处理器,需要实现HandlerExceptionResolver 接口,并且该类需要在 SpringMVC配置文件中进行注册。只要有异常发生,无论什么异常,都会自动执行接口方法 resolveException() 。
自定义异常处理器
public class MyExceptionResolver implements HandlerExceptionResolver {
/**
* 接口中的唯一方法, 当程序抛出异常时,中央调度器会调用resolveException()处理异常。
* resolveException()方法的执行结果是ModelAndView, 这个ModelAndView就是用户看得到结果。
* 参数:
* Object handler:发生异常的处理器对象
* Exception ex:抛出的异常对象
* 返回:ModelAndView
* ModelAndView: 异常的处理结果,有数据和视图。
*/
@Override
public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
ModelAndView model = new ModelAndView();
//将异常信息放入模型中
model.addObject("ex",ex);
//设置默认错误响应页面
model.setViewName("defaultError");
//设置NameException错误响应页面
if(ex instanceof NameException){
model.setViewName("nameException");
}
return model;
}
}
复制
控制层方法
@RequestMapping("/test_exception2")
public ModelAndView test_exception2(String name,int age) throws NameException{
if(!"langlihge".equals(name)){
throw new NameException("姓名不正确");
}
return new ModelAndView("show.jsp");
}
复制
注册异常处理器
<!--注册异常处理器-->
<bean class="com.huge.exception.MyExceptionResolver"></bean>
复制
异常处理注解
使用注解@ExceptionHandler 可以将一个方法指定为异常处理方法。该注解只有一个可选属性 value ,为一个 Class<?> 数组,用于指定该注解的方法所要处理的异常类,即所要匹配的异常。
而被注解的方法 ,其 返回 值可以是 ModelAndView 、 String ,或 void ,方法名随意 ,方法参数可以是 Exception 及其子类对象、HttpServletRequest 、 HttpServletResponse 等 。系统会自动为这些方法参数赋值。对于异常处理注解的用法,也可以直接将异常处理方法注解于Controller 之中。
测试方法
@Controller
@RequestMapping("/test")
public class MyControllerExAnno {
@RequestMapping("/test_exceptionExAnno")
public ModelAndView test_exceptionExAnno(String name, int age) throws NameException {
if(!"langlihge".equals(name)){
throw new NameException("姓名不正确");
}
return new ModelAndView("show.jsp");
}
//NameException异常处理
@ExceptionHandler(NameException.class)
public ModelAndView handNameException(Exception ex){
ModelAndView model = new ModelAndView();
model.addObject("ex",ex);
model.setViewName("nameError");
return model;
}
}
复制
不过,一般不这样使用。而是将异常处理方法专门定义在一个类 中, 作为全局的异常处理类。
需要使用注解@ControllerAdvice 字面理解就是“控制器增强” 是给控制器对象增强功能的。使用 @ControllerAdvice 修饰的类中可以使用 @ExceptionHandle r 。
当使用@Req uestMapping 注解修饰的方法抛出异常时,会执行 @ControllerAdvice 修饰的类中的异常处理方法。
@ControllerAdvice 是使用 @C omponent 注解修饰的,可以 <context:component scan>扫描到 @ControllerAdvice 所在的类路径 包名 创建对象。
// 控制器增强,给控制器类增加功能, 通常增加异常处理功能
@ControllerAdvice
public class AppExceptionResolver {
//定义异常的处理方法, 方法上面加入@ExceptionHandler
/**
* 在处理器类中,定义方法,处理异常。
* 处理异常的方法原型:同处理器方法。
* 在方法的上面加入@ExceptionHandler()
*/
//处理NameException
@ExceptionHandler(NameException.class)
public ModelAndView doNameException(Exception ex){
ModelAndView model = new ModelAndView();
model.addObject("ex",ex);
model.setViewName("nameError");
return model;
}
//处理其他异常
@ExceptionHandler
public ModelAndView deOtherException(Exception ex){
ModelAndView model = new ModelAndView();
model.addObject("ex",ex);
model.setViewName("defaultError");
return model;
}
}
复制
喜欢转发
明天见
SpringMVC 10 处理器方法的返回值(ModelAndView和String))
SpringMVC 07 @RequestMapping说明