异常处理有如下两个监控方法:
@ExceptionHandler(value = BusinessException.class)
@ResponseBody
public ResultVO handlerSellerException(BusinessException e) {
return ResultVOUtil.error(e.getExceptionCode(), e.getExceptionMessage());
}
@ExceptionHandler(value = RuntimeException.class)
public ModelAndView defaultErrorHandler(HttpServletRequest req, RuntimeException e) throws Exception {
e.printStackTrace();
ModelAndView mav = new ModelAndView();
mav.addObject("exception", e);
mav.addObject("url", req.getRequestURL());
mav.setViewName(DEFAULT_ERROR_VIEW);
return mav;
}
理想状态是BusinessException异常进第一个异常处理,其它运行时异常进入第个方法处理,但是实际上跑起来全有异常都进入了第个异常处理方法,首先想到的是增加@Order来设置顺序,没效果。
网上找了下资料也没有对应有效资料说明。然后灵光一转把两个异常监控方法单独出来一个类,在类上设置@Order顺序来执行异常的顺序判断,测试正常。
代码如下:
@ControllerAdvice
@Order(2)
public class RuntimeExceptionHandler {
public static final String DEFAULT_ERROR_VIEW = "error/error";
@ExceptionHandler(value = RuntimeException.class)
public ModelAndView defaultErrorHandler(HttpServletRequest req, RuntimeException e) throws Exception {
e.printStackTrace();
ModelAndView mav = new ModelAndView();
mav.addObject("exception", e);
mav.addObject("url", req.getRequestURL());
mav.setViewName(DEFAULT_ERROR_VIEW);
return mav;
}
}
/**
* 业务异常处理
*/
@Order(-2)
@ControllerAdvice
public class BaseExceptionHandler {
@ExceptionHandler(value = BusinessException.class)
@ResponseBody
public ResultVO handlerSellerException(BusinessException e) {
return ResultVOUtil.error(e.getExceptionCode(), e.getExceptionMessage());
}
}