SpringBoot与SpringMVC全局异常处理
对于一个成熟性项目,后端开发需要与前端约定一个固定响应报文格式,防止因响应格式混乱造成前端项目不易维护等问题出现。即约定减少不必要沟通。
为此我们除了对成功返回的数据定义一个固定返回体外,对异常也应该适配这个返回体。
全局异常处理:
SpringBoot项目全局异常处理:
1.使用@RestControllerAdvice(@ResponseBody+@ControllerAdvise)标记在类上,然后使用@ExceptionHandler注解标记在方法上,对指定异常进行拦截,并返回自定义的页面或Json串。
1 /** 2 * RestControllerAdvice注解默认拦截所有的Controller的异常; 3 * 如果需要指定包或者指定类进行处理,则设置对应的属性即可 4 **/ 5 @RestControllerAdvice 6 public class GlobalExceptionHandler { 7 8 @ExceptionHandler(Exception.class) 9 public ResponseResult handle(Exception exception) { 10 return ResponseResult.failed(500, exception.getMessage()); 11 } 12 13 @ExceptionHandler(BusinessException.class) 14 public ResponseResult handle(BusinessException exception) { 15 return ResponseResult.failed(400, exception.getMessage()); 16 } 17 }
SpringMVC全局异常处理
2.编写一个全局异常处理类去实现HandlerExceptionResolver接口,根据异常确定返回ModelAndView对象
1 @Component 2 public class GlobalHandlerExceptionResolver implements HandlerExceptionResolver { 3 4 @Override 5 public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) { 6 ModelAndView modelAndView = new ModelAndView(); 7 // prefix = "/statics/page/error/" suffix = ".html" 8 if(ex instanceof BusinessException){ 9 modelAndView.setViewName("businessError"); 10 }else if(ex instanceof RuntimeException){ 11 modelAndView.setViewName("500error"); 12 }else{ 13 modelAndView.setViewName("service_unavailable"); 14 } 15 return modelAndView; 16 } 17 }
重定向参数处理:
方法上声明一个形参RedirectAttributes,将属性通过调用addFlashAttribute("name","value")方法进行传递。
探索不以困难而止,学习不以艰苦而终