SpringMVC 异常处理机制与自定义异常处理方式

 更新时间:2021年10月27日 14:34:55   作者:许中宝  
这篇文章主要介绍了SpringMVC 异常处理机制与自定义异常处理方式,具有很好的开车价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

本节介绍SpringMVC的异常处理机制

首先介绍SpringMVC默认提供了一些HTTP错误类似码的默认异常处理

如何给一个Controller自定义异常处理

如何为项目做一个全局异常处理

提到异常处理,就不得不提HandlerExceptionResolvers,我们的DispatcherServlet默认设置三个异常处理器:

  • AnnotationMethodHandlerExceptionResolver:通过注解@ExceptionHandler实现异常理出
  • ResponseStatusExceptionResolver:通过注解@ResponseStatus处理HTTP请求的状态码异常
  • DefaultHandlerExceptionResolver:处理Spring Exception并将其转换为HTTP响应状态码传送的客户端

SpringMVC默认处理的几种异常

Exception HTTP Status Code

BindException

400 (Bad Request)

ConversionNotSupportedException

500 (Internal Server Error)

HttpMediaTypeNotAcceptableException

406 (Not Acceptable)

HttpMediaTypeNotSupportedException

415 (Unsupported Media Type)

HttpMessageNotReadableException

400 (Bad Request)

HttpMessageNotWritableException

500 (Internal Server Error)

HttpRequestMethodNotSupportedException

405 (Method Not Allowed)

MethodArgumentNotValidException

400 (Bad Request)

MissingServletRequestParameterException

400 (Bad Request)

MissingServletRequestPartException

400 (Bad Request)

NoHandlerFoundException

404 (Not Found)

NoSuchRequestHandlingMethodException

404 (Not Found)

TypeMismatchException

400 (Bad Request)

MissingPathVariableException

500 (Internal Server Error)

NoHandlerFoundException

404 (Not Found)

首先介绍的是注解@ResponseStatus

@ResponseStatus

用于自定义异常类上

该异常属于某种HTTP错误状态码异常(或者说交由其处理)

例如:我们自定义一个异常类:HttpStateCode404Exception,将其映射到404状态码

异常类:HttpStateCode404Exception.java

/**
 *使用@ResponseStatus只能实现简单的提示
 *当程序中抛出HttpStateCode404Exception会使用提示语:页面未找到
 */
@ResponseStatus(code=HttpStatus.NOT_FOUND,reason="页面未找到")
public class HttpStateCode404Exception extends RuntimeException{
    private static final long serialVersionUID = 1L;
}

然后我们在一个Controller类处理/handleException/存在在的映射路径时的处理方法

@Controller
@RequestMapping("handleException")
public class HandleExceptionController {
    /*@ExceptionHandler({Throwable.class})
    public String handleThisController(){
        return "/handleException/404";
    }*/
    @RequestMapping("{url}")
    public void handle404(){
        throw new HttpStateCode404Exception();
    }
}

细心的读者,一定会发现,我在上面注掉的代码使用了@ExceptionHandler注解

最终我们可以得到错误页面提示是这样的:好丑,但是有我们的reason

这里写图片描述

此方式只能实现简单的信息提示。

再来看看@ExceptionHandler

打开上面被注释掉的代码,你会发现我们的错误控制可以(转发)跳转页面了。

而且由于我们的这个方法定义在这个Controller类中,只要满足此@ExceptionHandler定义的异常都会走这个方法。

注意:是这个Controller类中所有请求出现异常,且异常被其包含

我希望定义一个全局异常处理呢???@ControllerAdvice

为我们实现处理所以的控制器Controllers的异常

具体实现

/**
 * 定义一个处理所有Controllers的ExceptionHandler
 */
@ControllerAdvice
public class GlobalExceptionAdvice {
    @ExceptionHandler({HttpStateCode404Exception.class})
    public String handleThisController(){
        return "/handleException/404";
    }
    /*处理其他异常...*/
}

异常处理的顺序

1.Controller处理时抛出异常

2.本Controller类中的@ExceptionHandler如果捕获到,就执行其处理方法

3.否则,由全局异常捕获处理

4.否则,由@ResponseStatus注解的异常捕获处理

5.最后DefaultHandlerExceptionResolver处理

这恰恰也就是DispatcherServlet异常处理器的配置顺序(循序调用,List)

自定义异常类(SpringMVC的异常处理)

SpringMVC当中的异常处理–自定义异常处理类

①:自定义异常类

public class CustomerException extends Exception {
    //定义我们的异常信息
    private String exceptMsg;
    public CustomerException(String exceptMsg){
        this.exceptMsg = exceptMsg;
    }
    public String getExceptMsg() {
        return exceptMsg;
    }
    public void setExceptMsg(String exceptMsg) {
        this.exceptMsg = exceptMsg;
    }
}

②:自定义异常处理器

import java.io.PrintWriter;
import java.io.StringWriter;
import javax.jws.WebParam.Mode;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.omg.CORBA.PRIVATE_MEMBER;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView;
public class CustomerExceptionResolver implements HandlerExceptionResolver {
    @Override
    public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler,Exception ex) {
        //通过我们自定义异常处理器,继承自HandlerExceptionResolver  来实现我们的异常处理
        //自定义我们的异常信息
        String  msg = "";
        //通过ModelAndView 来实现跳转到我们的错误页面,并且将错误信息带回到页面进行显示
        ModelAndView view = new ModelAndView();
        view.setViewName("error");
        //取出我们自定义的异常信息
        if(ex instanceof CustomerException){
            CustomerException exception = (CustomerException) ex;
            msg = exception.getExceptMsg();
        }else{
            //获取我们的stringWriter来获取我们的异常信息
            StringWriter writer = new StringWriter();
            PrintWriter printWriter = new PrintWriter(writer);
            //通过ex.printStackTrace(printWriter);来向我们的printWriter当中输入异常信息
            ex.printStackTrace(printWriter);
            msg = writer.toString();
        }
        //获取到异常信息之后,通过短信,邮件等技术,通知相关人员
        view.addObject("msg", msg);
        return view;
    }
}

③:配置我们的异常处理器

<!-- 申明我们的异常解析处理类-->
<bean id="customerExceptionResolver" class="cn.itcast.springmvc.exception.CustomerExceptionResolver"></bean>

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • java实现图片无损任意角度旋转

    java实现图片无损任意角度旋转

    这篇文章主要为大家详细介绍了java实现图片无损任意角度旋转,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-02-02
  • springboot整合mybatis plus与druid详情

    springboot整合mybatis plus与druid详情

    这篇文章主要介绍了springboot整合mybatis plus与druid详情,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的下伙伴可以参考一下
    2022-09-09
  • Java Map 按key排序和按Value排序的实现方法

    Java Map 按key排序和按Value排序的实现方法

    下面小编就为大家带来一篇Java Map 按key排序和按Value排序的实现方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-08-08
  • SpringBoot传递单一参数时@RequestParam和@RequestBody的区别小结

    SpringBoot传递单一参数时@RequestParam和@RequestBody的区别小结

    用SpringBoot框架做项目时,经常需要前端给后端传递参数,本文主要介绍了SpringBoot传递单一参数时@RequestParam和@RequestBody的区别,具有一定的参考价值,感兴趣的可以了解一下
    2023-08-08
  • java 百度手写文字识别接口配置代码

    java 百度手写文字识别接口配置代码

    本文通过实例代码给大家介绍了java 百度手写文字识别接口配置方法,代码简单易懂,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2022-01-01
  • 如何将Set直接转成数组

    如何将Set直接转成数组

    这篇文章主要介绍了如何将Set直接转成数组,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-10-10
  • Mybatis Plus批处理操作的实现示例

    Mybatis Plus批处理操作的实现示例

    MyBatis Plus 提供了强大的批处理支持,可以帮助我们高效地处理大规模数据,本文主要介绍了Mybatis Plus批处理操作的实现示例,具有一定的参考价值,感兴趣的可以了解一下
    2024-07-07
  • java 抽象类和接口的区别详细解析

    java 抽象类和接口的区别详细解析

    abstractclass和interface是Java语言中对于抽象类定义进行支持的两种机制,正是由于这两种机制的存在,才赋予了Java强大的面向对象能力,需要了解的朋友可以参考下
    2012-11-11
  • Maven继承与聚合详解及作用介绍

    Maven继承与聚合详解及作用介绍

    继承关系中,分为父模块与子模块,父模块也被称为 parent 模块,子模块会继承父模块的依赖,父模块中也可以设置依赖管理器,供子模块选择是否需要某些依赖
    2022-08-08
  • Java实战之制作在线音乐网站

    Java实战之制作在线音乐网站

    这篇文章主要介绍了如何通过Java实现一个精美风的在线音乐网站,文章采用到了JSP、JQuery、Ajax等技术,感兴趣的小伙伴可以了解一下
    2022-02-02

最新评论