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;
  }
}

测试结果:

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

(0)

相关推荐

  • Spring Boot Log4j2的配置使用详解

    后台程序开发及上线时,一般都会用到Log信息打印及Log日志记录,开发时通过Log信息打印可以快速的定位问题所在,帮助我们快捷开发.程序上线后如遇到Bug或错误,此时则需要日志记录来查找发现问题所在. Spring Boot 可以集成很多不同的日志系统,其中最常用的Apache Log4j,而Log4j 2是Log4j的升级版本,Log4j 2相对于Log4j 1.x 有了很多显著的改善.所以这篇博客就直接来说说Spring Boot如何集成并配置使用Log4j2. 1. 导入Log4j2的包

  • SpringBoot整合Elasticsearch7.2.0的实现方法

    Spring boot 2.1.X整合Elasticsearch最新版的一处问题 新版本的Spring boot 2的spring-boot-starter-data-elasticsearch中支持的Elasticsearch版本是2.X,但Elasticsearch实际上已经发展到7.2.X版本了,为了更好的使用Elasticsearch的新特性,所以弃用了spring-boot-starter-data-elasticsearch依赖,而改为直接使用Spring-data-elastics

  • spring boot2.0图片上传至本地或服务器并配置虚拟路径的方法

    最近写了关于图片上传至本地文件夹或服务器,上传路径到数据库,并在上传时预览图片.使用到的工具如下: 框架:spring boot 2.0 前端模板:thymeleaf 图片预览:js 首先,上传以及预览,js以及<input type="file">,以及预览图片的JS function Img(obj){ var imgFile = obj.files[0]; console.log(imgFile); var img = new Image(); var fr = ne

  • SpringBoot2.0 整合 SpringSecurity 框架实现用户权限安全管理方法

    一.Security简介 1.基础概念 Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架.它提供了一组可以在Spring应用上下文中配置的Bean,充分利用了Spring的IOC,DI,AOP(面向切面编程)功能,为应用系统提供声明式的安全访问控制功能,减少了为安全控制编写大量重复代码的工作. 2.核心API解读 1).SecurityContextHolder 最基本的对象,保存着当前会话用户认证,权限,鉴权等核心数据.Secu

  • springboot配置内存数据库H2教程详解

    业务背景:因soa系统要供外网访问,处于安全考虑用springboot做了个前置模块,用来转发外网调用的请求和soa返回的应答.其中外网的请求接口地址在DB2数据库中对应专门的一张表来维护,要是springboot直接访问数据库,还要专门申请权限等,比较麻烦,而一张表用内置的H2数据库维护也比较简单,就可以作为替代的办法. 环境:springboot+maven3.3+jdk1.7 1.springboot的Maven工程结构 说明一下,resource下的templates文件夹没啥用.我忘记

  • Springboot2.X集成redis集群(Lettuce)连接的方法

    前提:搭建好redis集群环境,搭建方式请看:https://www.jb51.net/article/143749.htm 1. 新建工程,pom.xml文件中添加redis支持 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> 2

  • SpringBoot2.0 整合 Dubbo框架实现RPC服务远程调用方法

    一.Dubbo框架简介 1.框架依赖 图例说明: 1)图中小方块 Protocol, Cluster, Proxy, Service, Container, Registry, Monitor 代表层或模块,蓝色的表示与业务有交互,绿色的表示只对 Dubbo 内部交互. 2)图中背景方块 Consumer, Provider, Registry, Monitor 代表部署逻辑拓扑节点. 3)图中蓝色虚线为初始化时调用,红色虚线为运行时异步调用,红色实线为运行时同步调用. 4)图中只包含 RPC

  • SpringBoot 2.0 整合sharding-jdbc中间件实现数据分库分表

    一.水平分割 1.水平分库 1).概念:  以字段为依据,按照一定策略,将一个库中的数据拆分到多个库中. 2).结果  每个库的结构都一样:数据都不一样:  所有库的并集是全量数据: 2.水平分表 1).概念  以字段为依据,按照一定策略,将一个表中的数据拆分到多个表中. 2).结果  每个表的结构都一样:数据都不一样:  所有表的并集是全量数据: 二.Shard-jdbc 中间件 1.架构图 2.特点 1).Sharding-JDBC直接封装JDBC API,旧代码迁移成本几乎为零. 2).适

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

    统一异常处理相关注解介绍 @ControllerAdvice 声明在类上用于指定该类为控制增强器类,如果想声明返回的结果为 RESTFull 风格的数据,需要在声明 @ExceptionHandler 注解的方法上同时加 上 @ResponseBody @RestControllerAdvice 声明在类上用于指定该类为控制增强器类.并声明返回的结果为 RESTFull 风格的数据,无需在声明@ExceptionHandler 注解的方法上加@ResponseBody @ExceptionHan

  • 基于springboot处理date参数过程解析

    这篇文章主要介绍了基于springboot处理date参数过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 前言 最近在后台开发中遇到了时间参数的坑,就单独把这个问题提出来找时间整理了一下: 正文 测试方法 bean代码: public class DateModelNoAnnotation { private Integer id; private Date receiveDate; } controller代码: @RestContr

  • SpringBoot整合Junit实例过程解析

    这篇文章主要介绍了SpringBoot整合Junit实例过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 前提条件:SpringBoot已经整合了Mybatis,至于SpringBoot如何整合Mybatis可参考SpringBoot整合mybatis简单案例过程解析 SpringBoot为什么要整合Juni? SpringBoot整合了Junit后,在写了Mapper接口后,可直接通过Junit进行测试,不用再写Controller层,

  • Springboot 集成 lombok.jar过程解析

    这篇文章主要介绍了Springboot 集成 lombok.jar过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 介绍 Spring Boot是非常高效的开发框架,lombok是一套代码模板解决方案,将极大提升开发的效率,这里介绍给大家使用. Lombok想要解决了的是在我们实体Bean中大量的Getter/Setter方法,以及toString, hashCode等可能不会用到,但是某些时候仍然需要复写,以期方便使用的方法:在使用Lo

  • SpringBoot Shiro授权实现过程解析

    这篇文章主要介绍了SpringBoot Shiro授权实现过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 使用Shiro过滤器实现授权 设置好授权拦截跳转的请求地址 /** * 创建ShiroFilterFactoryBean */ @Bean public ShiroFilterFactoryBean getShiroFilterFactoryBean(@Qualifier("securityManager") Defaul

  • Springboot整合通用mapper过程解析

    这篇文章主要介绍了springboot整合通用mapper过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 找到springboot工程下的pom.xml文件,导入如下的依赖jar包 <!--配置通用Mapper start--> <dependency> <groupId>tk.mybatis</groupId> <artifactId>mapper-spring-boot-starte

  • SpringBoot yml配置文件调用过程解析

    这篇文章主要介绍了SpringBoot yml配置文件调用过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 1.yml配置文件书写格式 格式是在普通配置文件中以"."分割的属性名称,该为": "和换行. 例子: //普通格式 spring.datasource.driver-class-name=com.mysql.jdbc.Driver //yml格式 spring: datasource: driver-

  • SpringBoot使用thymeleaf模板过程解析

    这篇文章主要介绍了SpringBoot使用thymeleaf模板过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 1.导入依赖 <!-- 添加thymeleaf模版的依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</art

  • 基于SPRINGBOOT配置文件占位符过程解析

    这篇文章主要介绍了基于SPRINGBOOT配置文件占位符过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 一.配置文件占位符 1.application.properties server.port=8088 debug=false product.id=ID:${random.uuid} product.name=da mao mao product.weight=${random.int} product.fristLinePrice

  • SpringBoot整合Dubbo zookeeper过程解析

    这篇文章主要介绍了SpringBoot整合Dubbo zookeeper过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 docker pull zookeeper docker run --name zk01 -p 2181:2181 --restart always -d 2e30cac00aca 表明zookeeper已成功启动 Zookeeper和Dubbo• ZooKeeperZooKeeper 是一个分布式的,开放源码的分布式

随机推荐