SpringBoot 2 统一异常处理过程解析

 更新时间:2019年09月05日 08:21:05   作者:桌前明月  
这篇文章主要介绍了SpringBoot 2 统一异常处理过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

统一异常处理相关注解介绍

@ControllerAdvice

声明在类上用于指定该类为控制增强器类,如果想声明返回的结果为 RESTFull 风格的数据,需要在声明 @ExceptionHandler 注解的方法上同时加 上 @ResponseBody

@RestControllerAdvice

声明在类上用于指定该类为控制增强器类。并声明返回的结果为 RESTFull 风格的数据,无需在声明@ExceptionHandler 注解的方法上加@ResponseBody

@ExceptionHandler

声明在方法上用于指定需要统一拦截的异常。例如:@ExceptionHandler(value = Exception.class)

实战操作

定义消息类:

定义 RESTFull 返回 JSON 数据的消息类,其中包含成员变量如下:

  • code:错误码,0表示没有异常信息。
  • message:异常提示信息。
  • date:无异常是返回具体内容信息。
public class ReturnMessage<T> {
  private Integer code;//错误码
  private String message;//提示信息
  private T date;//返回具体内容
  public ReturnMessage(Integer code, String message, T date) {
    super();
    this.code = code;
    this.message = message;
    this.date = date;
  }
  //省略get and set方法  
}

** 消息类处理工具类:**

主要是用来处理成功或失败消息处理,该工具类主要包含是3个方法 :

  1. 成功处理含实体数据
  2. 成功处理 没有实体数据
  3. 失败处理

具体代码如下:

public class ReturnMessageUtil {
  /**
   * 无异常 请求成功并有具体内容返回
   * @param object
   * @return
   */
  public static ReturnMessage<Object> sucess(Object object) {
    ReturnMessage<Object> message = new ReturnMessage<Object>(0,"sucess",object);
    return message;
  }
  /**
   * 无异常 请求成功并无具体内容返回
   * @return
   */
  public static ReturnMessage<Object> sucess() {
    ReturnMessage<Object> message = new ReturnMessage<Object>(0,"sucess",null);
    return message;
  }
  /**
   * 有自定义错误异常信息
   * @param code
   * @param msg
   * @return
   */
  public static ReturnMessage<Object> error(Integer code,String msg) {
    ReturnMessage<Object> message = new ReturnMessage<Object>(code,msg,null);
    return message;
  }
 }

自定义异常类:

我们通过自定义系统异常类来完成校验相关的操作,自定义系统异常类通过继承 RuntimeException ,然后声明名称为 code 的成员变量来表示不同类型异常。

主要是用于异常拦截后获取自定义异常的 code ,并将code 设置到消息类中。

public class SbException extends RuntimeException{
  private Integer code; 
  public Integer getCode() {
    return code;
  }
  public void setCode(Integer code) {
    this.code = code;
  }  
  public SbException(Integer code,String message) {
    super(message);
    this.code = code;
  }  
}

定义统一异常拦截类:

通过声明 @RestControllerAdvice 表示该类为 RESTFul 风格的异常处理控制增强器类,在 handle 方法声明 @ExceptionHandler 并在该注解中指定要拦截的异常类。具体代码如下:

@RestControllerAdvice
public class ExceptionHandle {
  private final static Logger logger = LoggerFactory.getLogger(ExceptionHandle.class);
  
  @ExceptionHandler(value = Exception.class)
  public ReturnMessage<Object> handle(Exception exception) {
    if(exception instanceof SbException) {
      SbException sbexception = (SbException)exception;
      return ReturnMessageUtil.error(sbexception.getCode(), sbexception.getMessage());
    }else {
      logger.error("系统异常 {}",exception);
      return ReturnMessageUtil.error(-1, "未知异常"+exception.getMessage());
    }
  }
}

测试

分别测试自定义异常和系统异常,通过 /error/custome 测试自定义异常,通过 /error/unknown 测试未知的系统异常。具体代码如下:

@RestController
@RequestMapping("/error")
public class DemoException {  
  @GetMapping(value = "custome")
  public void customException() {
    SbException sbe = new SbException(100, "这个是自定义异常!");
    throw sbe;
  }
  @GetMapping(value = "unknown")
  public void unknownException() {
    int i = 0;
    int b = 1/i;
  }
}

测试结果:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • JAVA包装类及自动封包解包实例代码

    JAVA包装类及自动封包解包实例代码

    JAVA包装类及自动封包解包实例代码,需要的朋友可以参考一下
    2013-03-03
  • Java基础之类型封装器示例

    Java基础之类型封装器示例

    这篇文章主要介绍了Java基础之类型封装器,结合实例形式分析了java类型封装相关原理与操作技巧,需要的朋友可以参考下
    2019-08-08
  • Spring security oauth2以redis作为tokenstore及jackson序列化失败问题

    Spring security oauth2以redis作为tokenstore及jackson序列化失败问题

    这篇文章主要介绍了Spring security oauth2以redis作为tokenstore及jackson序列化失败问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教<BR>
    2024-04-04
  • Tomcat 实现WebSocket详细介绍

    Tomcat 实现WebSocket详细介绍

    这篇文章主要介绍了Tomcat 如何实现WebSocket的相关资料,对WebSocket协议通信的过程进行了详细介绍,需要的朋友可以参考下
    2016-12-12
  • Java的LinkedHashSet解析

    Java的LinkedHashSet解析

    这篇文章主要介绍了Java的LinkedHashSet解析,Set接口的哈希表和链表实现,具有可预测的迭代顺序,此实现与 HashSet的不同之处在于它维护一个双向链表,该列表贯穿其所有条目,这个链表定义了迭代顺序,需要的朋友可以参考下
    2023-09-09
  • 工厂模式_动力节点Java学院整理

    工厂模式_动力节点Java学院整理

    这篇文章主要介绍了工厂模式_动力节点Java学院整理的相关资料,需要的朋友可以参考下
    2017-08-08
  • java实现jframe透明窗体示例

    java实现jframe透明窗体示例

    这篇文章主要介绍了java实现jframe透明窗体示例,需要的朋友可以参考下
    2014-03-03
  • springboot IDEA启动两个端口服务nginx负载过程

    springboot IDEA启动两个端口服务nginx负载过程

    这篇文章主要介绍了springboot IDEA启动两个端口服务nginx负载过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-03-03
  • Spring Boot 和 Spring 到底有啥区别你知道吗

    Spring Boot 和 Spring 到底有啥区别你知道吗

    Spring Boot框架的核心就是自动配置,只要存在相应的jar包,Spring就帮我们自动配置。接下来通过本文给大家介绍Spring与Spring boot的区别介绍,非常不错,需要的朋友参考下吧
    2021-08-08
  • SpringBoot结合Neo4j自定义cypherSql的方法

    SpringBoot结合Neo4j自定义cypherSql的方法

    这篇文章主要介绍了SpringBoot结合Neo4j自定义cypherSql,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-11-11

最新评论