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")方法进行传递。

 

posted @ 2020-07-11 11:49  今夕是何年?  阅读(206)  评论(0编辑  收藏  举报