📓 Archive

  • Pricing
  • Chess
  • Syntax
  • SPRINGMVC

    FGJ: Create:2022/10/24 Update: (2024-10-24)

    springmvc 执行流程 #

    过滤器 #

    拦截器 #

    数据绑定 #

    消息转换器 #

    异常处理 #

    • 注解ExceptionHandler

      注解ExceptionHandler作用对象为方法,最简单的使用方法就是放在controller文件中,详细的注解定义不再介绍。 如果项目中有多个controller文件,通常可以在baseController中实现ExceptionHandler的异常处理,而各个contoller继承basecontroller从而达到统一异常处理的目的。因为比较常见,简单代码如下:

      单个controller处理
      @ExceptionHandler(Exception.class)
      @ResponseBody
      public String exceptionHandler(Exception ex){
          return this.getClass().getSimpleName() + ": " + ex.getMessage();
      } 
      
    • 注解ControllerAdvice

      这里虽说是ControllerAdvice注解,其实是其与ExceptionHandler的组合使用。 在上文中可以看到,单独使用@ExceptionHandler时,其必须在一个Controller中,然而当其与ControllerAdvice组合使用时就完全没有了这个限制。换句话说,二者的组合达到的全局的异常捕获处理。

      *** 注解ControllerAdvice 等级低于第一个。而且第一个只处理当前Controller。顺序为 @ExceptionHandler,@ControllerAdvice,HandlerExceptionResolver

      全局异常处理
      @ControllerAdvice
      public class ExceptionHandlerAdvice {
          //也可以出现   自定义Exception,和其他Exception
          @ExceptionHandler(Exception.class)
          @ResponseBody
          public String exceptionHandler(Exception ex){
              return this.getClass().getSimpleName() + ": " + ex.getMessage();
          }
      }   
      
    • 实现HandlerExceptionResolver接口

      HandlerExceptionResolver本身SpringMVC内部的接口,其内部只有resolveException一个方法,通过实现该接口我们可以达到全局异常处理的目的。

      *** 400异常不会处理,500 可以 出现的原因;被默认的处理器处理了,如图: https://segmentfault.com/img/bVbnJqq?w=866&h=497 解决办法,实现ordered 接口排序第一位。就可以实现所以异常处理。

      全局异常处理
      @Component
      public class MyHandlerExceptionResolver implements HandlerExceptionResolver, Ordered {
      
          @Override
          public ModelAndView resolveException(HttpServletRequest request,
                                               HttpServletResponse response,
                                               Object handler,
                                               Exception ex) {
              PrintWriter writer = null;
              try {
                  writer = response.getWriter();
              } catch (IOException e) {
                  e.printStackTrace();
              }
              writer.write(this.getClass().getSimpleName() + ": " + ex.getMessage());
              writer.flush();
              writer.close();
              return new ModelAndView();
          }
      
          @Override
          public int getOrder() {
              return -1;
          }
      }
      

    Reference #


    comments powered by Disqus