SpringMVC 第十五章 SpringMVC 异常处理机制


SpringMVC —— 第十五章 SpringMVC 异常处理机制


1. 异常处理思路

系统中的异常包括两类: 预期异常运行时异常RuntimeException ,前者通过捕获异常从而获取异常信息,后者主要通过规范代码开发、测试等手段减少运行时异常的发生。

系统的 Dao、Service、Controller 出现都通过 throw Exception 向上抛出,最后由 SpringMVC 前端控制器交由异常处理器进行异常处理,如下图所示:

SpringMVCException

2. 异常的处理方式

  • 使用 SpringMVC 提供好的简单异常处理器 SimpleMappingExceptionResolver
  • 使用 Spring 的异常处理借口 HandlerExceptionResolver 自定义自己的异常处理器

3. 简单异常处理器 SimpleMappingExceptionResolver

SpringMVC 已经定义好了该类型的转换器,在使用的时候可以根据项目情况进行相应异常与视图的映射配置

<!-- Configure simple mapping exception handling -->
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
    <!-- Default error view -->
    <property name="defaultErrorView" value="error.jsp" />
    <property name="exceptionMappings">
        <map>
            <!-- Exception type | Error view -->
            <entry key="com.gregperlinli.exception.MyException" value="error.jsp" />
            <entry key="java.lang.ClassCastException" value="error.jsp" />
        </map>
    </property>
</bean>

4. 自定义异常处理步骤

  1. 创建异常处理器类实现 HandelerExceptionResolver
  2. 配置异常处理器
  3. 编写异常页面
  4. 测试异常跳转

示例代码:

com.yourname.exception.MyException

/**
 * @author gregperlinli
 */
public class MyException extends Exception &#123;
&#125;

com.yourname.controller.DempController

/**
 * @author gregperlinli
 */
@Controller
public class DemoController &#123;

    @Autowired
    private DemoService demoService;

    @RequestMapping(value = "/show")
    public String show(@RequestParam(value = "name", required = false) String name) throws FileNotFoundException, MyException &#123;
        System.out.println("show running");
        // demoService.show1();
        demoService.show5();
        return "index.jsp";
    &#125;

&#125;

com.yourname.service.DemoService

/**
 * @author gregPerlinLi
 * @since 2021-09-15
 */
public class DemoServiceImpl&#123;
    @Override
    public void show1() &#123;
        System.out.println("Throw type exception...");
        Object str = "gregPerlinLi";
        Integer num = (Integer) str;
    &#125;
    @Override
    public void show2() &#123;
        System.out.println("Throw divide by zero exception...");
        int i = 1/0;
    &#125;
    @Override
    public void show3() throws FileNotFoundException &#123;
        System.out.println("File not find exception...");
        InputStream in = new FileInputStream("gregperlinli/");
    &#125;
    @Override
    public void show4() &#123;
        System.out.println("Null pointer exception...");
        String str = null;
        str.length();
    &#125;
    @Override
    public void show5() throws MyException &#123;
        System.out.println("Custom exception");
        throw new MyException();
    &#125;
&#125;

com.yourname.resolver.MyExceptionResolver

/**
 * @author gregPerlinLi
 * @since 2021-09-15
 */
public class MyExceptionResolver implements HandlerExceptionResolver &#123;
    /**
     * @param e Exception object
     * @return Information to jump to error view
     */
    @Override
    public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) &#123;
        ModelAndView modelAndView = new ModelAndView();
        if ( e instanceof MyException ) &#123;
            modelAndView.addObject("info", "Customize exception");
        &#125; else if ( e instanceof ClassCastException ) &#123;
            modelAndView.addObject("info", "Type conversion exception");
        &#125;
        modelAndView.setViewName("error.jsp");
        return modelAndView;
    &#125;
&#125;

error.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Error</title>
    <style type="text/css">
        body &#123;
            font-family: Futura, "PingFang SC", Helvetica, Arial, sans-serif;
        &#125;
    </style>
</head>
<body>
    <h1>General error prompt page</h1>
    <h1>$&#123;info&#125;</h1>
</body>
</html>

spring-mvc.xml

<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/"/>
</bean>

<bean id="demoService" class="com.gregperlinli.service.impl.DemoServiceImpl" >
</bean>

<!-- Controller component scan -->
<context:component-scan base-package="com.gregperlinli.controller"/>

<!-- Annotation driven MVC -->
<mvc:annotation-driven/>

<!-- Open access to static resources -->
<mvc:default-servlet-handler/>

<!-- Custom processor -->
<bean class="com.gregperlinli.resolver.MyExceptionResolver" />

web.xml

<!-- Configure the front end controller of spring MVC -->
<servlet>
    <servlet-name>dispatcherServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:spring-mvc.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>dispatcherServlet</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

5. 知识要点

异常处理方式

  • 配置简单的异常处理器 SimpleMappingExceptionResolver
  • 自定义异常处理器

自定义异常处理步骤

  1. 创建异常处理器类实现 HandelerExceptionResolver
  2. 配置异常处理器
  3. 编写异常页面
  4. 测试异常跳转


文章作者: gregPerlinLi
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 gregPerlinLi !
  目录