Spring MVC 异常处理

  • Spring MVC 通过 HandlerExceptionResolver 处理程序的异常,包括 Handler 映射、数据绑定以及目标方法执行时发生的异常
  • SpringMVC 提供的 HandlerExceptionResolver 的实现类
    Spring MVC 异常处理
  • 当没有装配 <mvc:annotation-driven/> 时,默认使用以下三个 HandlerExceptionResolver
    Spring MVC 异常处理
  • 当装配了 <mvc:annotation-driven/> 时,默认使用以下三个 HandlerExceptionResolver
    Spring MVC 异常处理

ExceptionHandlerExceptionResolver

  • 用来处理被@ExceptionHandler标注了处理方法的异常
  • 处理异常的方法用 @ExceptionHandler 标注,可以放置在标注了Controller的类下面;也可以放置在单独写的一个类,标注为@ControllerAdvice,表示全局的异常处理类。
  • 以下方法表示,可以处理ArithmeticException的方法。可以在入参中接收Exception。返回值也可以如普通的请求映射一样,返回String类型,表示转发到指定的页面;也可以返回ModelAndView,在其中携带一些需要的对象。(注意,不能让 Map 作为入参)
      @ExceptionHandler(ArithmeticException.class)
      public ModelAndView arithmeticExceptionHandler(Exception e) {
        System.out.println("发生了 " + e);
        ModelAndView mv = new ModelAndView("error");
        mv.addObject("exception", e);
        return mv;
      }
    
  • 请求映射。当 num 为0时,会触发 ArithmeticException 异常。
      @RequestMapping("/div")
      public String div(Integer num) {
        int res = 10 / num;
        return "success";
      }
    
  • 异常之后,会跳转到该页面
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>ERROR</title>
    </head>
    <body>
    	<h1>发生异常了</h1>
    	<div>${exception}</div>
    </body>
    </html>
    
  • 当一个控制器类中存在多个异常处理方法时,以更精确的异常的方法为处理方法。
  • 全局处理方法
    @ControllerAdvice
    public class MyExceptionHandler {
      @ExceptionHandler(Exception.class)
      public ModelAndView allExceptionHandler(Exception e) {
        ModelAndView mv = new ModelAndView("error");
        mv.addObject("exception", e);
        System.out.println(mv);
        return mv;
      }
    }
    
  • 当即存在控制器内的处理方法,又存在全局处理方法时,优先选择控制器内自身的处理方法,无论异常是否精确。

ResponseStatusExceptionResolver

  • 用来处理自定义的异常,需要在该自定义异常上注解@ResponseStatus
  • 自定义异常, reason 为异常原因,会在异常页面上显示, value 为异常的状态编码。
    @ResponseStatus(reason="登录名不存在", value= HttpStatus.FORBIDDEN)
    public class UsernameNotFoundException extends RuntimeException {
      static final long serialVersionUID = -70348971944146939L;
    }
    
  • 请求映射。与一般异常一样,直接抛出即可。
    @RequestMapping("usernfTest")
      public String usernfTest(String username) {
        if (!"admin".equals(username)) throw new UsernameNotFoundException();
        return "success";
      }
    

DefaultHandlerExceptionResolver

  • 用来处理一些特殊的异常(Spring MVC自己定义的)
    • NoSuchRequestHandlingMethodException
    • HttpRequestMethodNotSupportedException
    • HttpMediaTypeNotSupportedException
    • HttpMediaTypeNotAcceptableException
  • 尝试触发一个异常
  • 请求映射
    @RequestMapping(value = "/postRequest", method = RequestMethod.POST)
      public String postRequest() {
        System.out.println("post 请求");
        return "success";
      }
    
  • 当在浏览器中发出请求的时候,是get请求,因此会触发异常HttpRequestMethodNotSupportedException
    Spring MVC 异常处理

SimpleMappingExceptionResolver

  • 该异常处理器不是默认的,需要在配置文件中配置。
  • 可以实现在xml文件中确定异常及异常显示页面的映射关系。
  • 注册 SimpleMappingExceptionResolverexceptionAttribute用来设置用来保存异常对象的key名,默认也是exceptionexceptionMappings用来保存异常以及页面之间的映射关系。error指向error.jsp文件。
    <bean id="simpleMappingExceptionResolver"
          class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
        <!--    设置保存异常信息的属性名,底层会自动将该名字作为key,value为异常对象    -->
        <property name="exceptionAttribute" value="exception"/>
        <property name="exceptionMappings">
            <props>
                <prop key="java.lang.NullPointerException">error</prop>
            </props>
        </property>
    </bean>
    
上一篇:addEventListener和attachEvent小结


下一篇:办公管理服务Service Partner One获千万美元A轮融资