SpringMVC 异常统一处理

  • 2016-05-27
  • 浏览 (78)

SpringMVC 提供的异常处理主要有两种方式,一种是直接实现自己的 HandlerExceptionResolver,另一种是使用注解 @ExceptionHandler 的方式。

1、实现自己的HandlerExceptionResolver,HandlerExceptionResolver是一个接口,SpirngMVC 本身已经对其有了一个自身的实现:DefaultExceptionResolver。
public class ExceptionHandler implements HandlerExceptionResolver {

@Override
public String resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
        return "exception";
    }
}
上述的 resolveException 的第4个参数表示对哪种类型的异常进行处理,如果想同时对多种异常进行处理,可以把它换成一个异常数组。

定义了这样一个异常处理器之后就要在applicationContext中定义这样一个bean对象,如:
<bean id="exceptionResolver" class="com.seaxiang.web.handler.ExceptionHandler"/>

2、使用 @ExceptionHandler 进行处理

网上说使用@ExceptionHandler进行处理有一个不好的地方是进行异常处理的方法必须与出错的方法在同一个Controller里面。其实有解决办法的,就是所有的 Controller 继承一个基类,在基类中实现 @ExceptionHandler。
@Controller
public class BlogController extends BaseAction{  
    @RequestMapping("test")
    public void test() {
        throw new Exception("出错了!");
    }
}
@Controller
public class BaseAction {
    Logger log = LoggerFactory.getLogger(BaseAction.class);

    /**
     * 用于处理全局异常
     * 使用 @ResponseBody 返回json数据
     * @return
     */
    @ResponseBody
    @ExceptionHandler({ Exception.class })
    public Result exception(Exception e) {
        e.printStackTrace();
        return new Result(Result.systemError, "系统异常!");
    }
}
这里在页面上访问test方法的时候就会报错,而拥有该test方法的Controller又拥有一个处理该异常的方法,这个时候处理异常的方法就会被调用。

当发生异常的时候,上述两种方式都使用了的时候,第一种方式会将第二种方式覆盖。
正文到此结束