动力节点旗下在线教育品牌  |  咨询热线:400-8080-105 学Java全栈,上蛙课网
首页 > 文章

简述4种Spring MVC异常处理器

08-24 17:34 127浏览
举报 T字号
  • 大字
  • 中字
  • 小字

Spring MVC除了可以做URL映射和请求拦截外,还可以做全局异常的处理。全局异常处理可能我们平时很少有机会接触,但是基本每个项目在完成之前都会做这个处理。所以,这门技术也是企业的刚需,是我们求职的加分项。而这门技术必须要用到4Spring MVC异常处理器

从大的方面来说,Spring MVC全局异常处理机制提供了二种进行全局异常处理的方式:

一、实现HandlerExceptionResolver接口,自定义异常处理器。

二、使用HandlerExceptionResolver接口的子类,也就是SpringMVC提供的异常处理器。

总的来说,SpringMVC提供异常处理器有四种:

1.DefaultHandlerExceptionResolver

这个异常处理器是SprngMVC默认的一个处理器,处理一些常见的异常,比如:没有找到请求参数,参数类型转换异常,请求方式不支持等等。

接着我们看DefaultHandlerExceptionResolver类的doResolveException()方法:

@Override

@Nullable

protected ModelAndView doResolveException(HttpServletRequest request, HttpServletResponse response,@Nullable Object handler, Exception ex) {

try {

if (ex instanceof HttpRequestMethodNotSupportedException) {

return handleHttpRequestMethodNotSupported((HttpRequestMethodNotSupportedException) ex, request,

response, handler);

}

else if (ex instanceof HttpMediaTypeNotSupportedException) {

return handleHttpMediaTypeNotSupported((HttpMediaTypeNotSupportedException) ex, request, response,

handler);

}

else if (ex instanceof HttpMediaTypeNotAcceptableException) {

return handleHttpMediaTypeNotAcceptable((HttpMediaTypeNotAcceptableException) ex, request, response,

handler);

}

//省略...以下还有十几种异常的else-if

}catch (Exception handlerException) {

            //是否打开日志,如果打开,那就记录日志

if (logger.isWarnEnabled()) {

logger.warn("Handling of [" + ex.getClass().getName() + "] resulted in Exception", handlerException);

}

}

return null;

}

2.SimpleMappingExceptionResolver

这种异常处理器需要提前配置异常类和对应的view视图。一般用于使用JSP的项目中,出现异常则通过这个异常处理器跳转到指定的页面。

那么应该怎么配置它呢?首先搭建JSP项目我就不浪费篇幅介绍了。首先要加载一个XML文件。

@SpringBootApplication

//在启动类,加载配置文件

@ImportResource("classpath:spring-config.xml")

public class Application {

    public static void main(String[] args) {

        SpringApplication.run(Application.class, args);

    }

}

然后在resources目录下,创建一个spring-config.xml文件,内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
        <!-- 定义默认的异常处理页面 -->
        <property name="defaultErrorView" value="err"/>
        <!-- 定义异常处理页面用来获取异常信息的变量名,默认名为exception -->
        <property name="exceptionAttribute" value="ex"/>
        <!-- 定义需要特殊处理的异常,用类名或完全路径名作为key,异常也页名作为值 -->
        <property name="exceptionMappings">
            <props>
                <!-- 数组越界异常 -->
                <prop key="java.lang.ArrayIndexOutOfBoundsException">err/arrayIndexOutOfBounds</prop>
                <!-- 空指针异常 -->
                <prop key="java.lang.NullPointerException">err/nullPointer</prop>
            </props>
        </property>
    </bean>
</beans>

然后在webapp也就是存放JSP页面的目录下,创建两个JSP页面。

3.ResponseStatusExceptionResolver

这种异常处理器主要用于处理带有@ResponseStatus注释的异常。下面演示一下使用方式。

首先自定义异常类继承Exception,并且使用@ResponseStatus注解修饰。如下:

//value需要使用HttpStatus枚举类型,HttpStatus.FORBIDDEN=403。

@ResponseStatus(value = HttpStatus.FORBIDDEN,reason = "My defined Exception")

public class DefinedException extends Exception{

}

复制代码然后再在Controller层抛出此异常。如下:

@Controller

@RequestMapping("/error")

public class ErrController {

    @RequestMapping("/myException")

    public String ex(@RequestParam(name = "num") Integer num) throws Exception {

        if (num == 1) {

            //抛出自定义异常

            throw new DefinedException();

        }

        return "index";

    }

}

4.ExceptionHandlerExceptionResolver

这个异常处理器才是最重要的,也是最常用,最灵活的,因为是使用注解。首先我们还是简单地演示一下怎么使用:

首先需要定义一个全局的异常处理器。

//这里使用了RestControllerAdvice,是@ResponseBody和@ControllerAdvice的结合

//会把实体类转成JSON格式的提示返回,符合前后端分离的架构

@RestControllerAdvice

public class GlobalExceptionHandler {

    //这里自定义了一个BaseException,当抛出BaseException异常就会被此方法处理

    @ExceptionHandler(BaseException.class)

    public ErrorInfo errorHandler(HttpServletRequest req, BaseException e) throws Exception {

        ErrorInfo r = new ErrorInfo();

        r.setMessage(e.getMessage());

        r.setCode(ErrorInfo.ERROR);

        r.setUrl(req.getRequestURL().toString());

        return r;

    }

}

复制代码然后我们自定义一个自定义异常类BaseException:

public class BaseException extends Exception {

    public BaseException(String message) {

        super(message);

    }

}

复制代码然后在Controller层定义一个方法测试:

@Controller

@RequestMapping("/error")

public class ErrController {

    @RequestMapping("/base")

    public String base() throws BaseException {

        throw new BaseException("系统异常,请稍后重试。");

    }

}

当然,我们也可以不自定义异常BaseException,而是直接拦截。所以这是一个非常灵活的异常处理器。你也可以做跳转页面,返回ModelAndView即可。

在学习了上面的介绍4种Spring MVC异常处理器的工作机制后,我们知道只需要把异常处理器加到集合中,就可以执行。那这么多异常处理器,究竟是如何工作的呢?为什么是设计一个接口,下面有一个抽象类加上四个实现子类呢?大家可以在本站的Spring MVC视频教程揭开谜底!

0人推荐
共同学习,写下你的评论
0条评论
爱读书的姑娘
程序员爱读书的姑娘

12篇文章贡献56281字

作者相关文章更多>

推荐相关文章更多>

DOM渲染的详细过程

QCode09-04 14:38

CSS水平和垂直居中技巧大梳理

Code大师09-04 14:50

mui的input框在IOS系统下无法聚焦或点击多次才能聚焦

不写代码你养我啊08-23 11:14

推荐的-视.频播放器以及在线客服

不写代码你养我啊09-17 18:02

谈谈java多线程的三大特性

要学习了06-18 18:13

发评论

举报

0/150

取消