iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >SpringBoot统一接口返回及全局异常怎么处理
  • 740
分享到

SpringBoot统一接口返回及全局异常怎么处理

2023-07-06 11:07:34 740人浏览 泡泡鱼
摘要

今天小编给大家分享一下SpringBoot统一接口返回及全局异常怎么处理的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。一、s

今天小编给大家分享一下SpringBoot统一接口返回及全局异常怎么处理的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

一、springBoot不使用统一返回格式

默认情况下,SpringBoot会有如下三种返回情况。

1.1 使用字符串返回
@GetMapping("/getUserName")public String getUserName(){    return "HuaGe";}

调用接口返回结果:

HuaGe
1.2 使用实体类返回
@GetMapping("/getUserName")public User getUserName(){    return new User("HuaGe",18,"男");}

调用接口返回结果:

{  "name": "HuaGe",  "age": "18",  "性别": "男", }
1.3 异常情况下返回
@GetMapping("/getUserName")public static String getUserName(){    HashMap hashMap = Maps.newHashMap();    return hashMap.get(0).toString();}

模拟一个空指针异常,在不做任何异常处理的情况下,可以看下SpringBoot的默认返回结果:

{    "timestamp": "2021-08-09T06:56:41.524+00:00",    "status": 500,    "error": "Internal Server Error",    "path": "/sysUser/getUserName"}

对于上面这几种情况,如果整个项目没有定义统一的返回格式,五个后台开发人员定义五种返回格式,这样不仅代码臃肿,前后端对接效率低,而且还会有一些意向不到的情况发生,比如前端直接显示异常详情等,这给用户的体验是非常差的。

二、基础玩法

项目中最常见到的是封装一个工具类,类中定义需要返回的字段信息,把需要返回前端的接口信息,通过该类进行封装,这样就可以解决返回格式不统一的现象了。

2.1 参数说明
  • code: 状态码,后台可以维护一套统一的状态码;

  • message: 描述信息,接口调用成功/失败的提示信息;

  • data: 返回数据。

2.2 流程说明
  • 新建Result类

public class Result<T> {        private int code;        private String message;        private T data;    public Result() {}    public Result(int code, String message) {        this.code = code;        this.message = message;    }            public static <T> Result<T> success(T data) {        Result<T> result = new Result<T>();        result.setCode(ResultMsgEnum.SUCCESS.getCode());        result.setMessage(ResultMsgEnum.SUCCESS.getMessage());        result.setData(data);        return result;    }        public static <T> Result<T> error(int code, String message) {        return new Result(code, message);    }}

定义返回状态码

public enum ResultMsgEnum {    SUCCESS(0, "成功"),    FaiL(-1, "失败"),    AUTH_ERROR(502, "授权失败!"),    SERVER_BUSY(503, "服务器正忙,请稍后再试!"),    DATABASE_OPERATioN_FAILED(504, "数据库操作失败");    private int code;    private String message;    ResultMsgEnum(int code, String message) {        this.code = code;        this.message = message;    }    public int getCode() {        return this.code;    }        public String getMessage() {        return this.message;    }}
  • 使用方式

上面两步定义了数据返回格式状态码,接下来就要看下在接口中如何使用了。

@GetMapping("/getUserName")public Result getUserName(){ &nbsp; &nbsp;return Result.success("huage");}

调用结果如下,可以看到是我们在Result中定义的参数类型。

{ &nbsp; &nbsp;"code": 0, &nbsp; &nbsp;"message": "成功", &nbsp; &nbsp;"data": "huage"}

这样写虽然能够满足日常需求,而且我相信很多小伙伴也是这么用的,但是如果我们有大量的接口,然后在每一个接口中都使用Result.success来包装返回信息,会新增很多重复代码,显得不够优雅,甚至都不好意思拿出去显摆。 肯定会有一种方式能够再一次提高代码逼格,实现最优解。

三、进阶用法

基本用法学会后,接下来看点究极版本,主要用到如下两个知识点,用法简单,无论是拿出来教学妹,还是指点小姐姐,都是必备技能。

3.1 类介绍
  • ResponseBodyAdvice: 该接口是springMVC 4.1提供的,它允许在 执行 @ResponseBody后自定义返回数据,用来封装统一数据格式返回;

  • @RestControllerAdvice: 该注解是对Controller进行增强的,可以全局捕获抛出的异常。

3.2 用法说明
  • 新建ResponseAdvice类;

  • 实现ResponseBodyAdvice接口,实现supportsbeforeBodyWrite方法;

  • 该类用于统一封装controller中接口的返回结果。

@RestControllerAdvicepublic class ResponseAdvice implements ResponseBodyAdvice<Object> {    @Autowired    private ObjectMapper objectMapper;        @Override    public boolean supports(MethodParameter methodParameter, Class<? extends HttpMessageConverter<?>> aClass) {        return true;    }        @Override    public Object beforeBodyWrite(Object o, MethodParameter methodParameter, MediaType mediaType, Class<? extends HttpMessageConverter<?>> aClass, ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse) {        //处理字符串类型数据        if(o instanceof String){            try {                return objectMapper.writeValueAsString(Result.success(o));            } catch (JSONProcessingException e) {                e.printStackTrace();            }        }        return Result.success(o);    }}

我们可以通过getUserName接口测试一下,会发现和直接使用Result返回的结果是一致的。

不过,细心的小伙伴们肯定注意到了,在ResponseAdvice我们全部使用了Result.success(o)来处理结果,对于error类型的结果未做处理。我们来看下,发生异常情况时,返回结果是什么样呢?继续使用上面HashMap空指针异常的代码,测试结果如下:

{    "code": 0,    "message": "成功",    "data": {        "timestamp": "2021-08-09T09:33:26.805+00:00",        "status": 405,        "error": "Method Not Allowed",        "path": "/sysUser/getUserName"    }}

虽然格式上没有毛病,但是在code、data字段的具体数据上是不友好或不正确的。不处理好这些事情,会严重影响自己在前端妹妹心中的高大形象的,这是决不能容忍的。

3.3 全局异常处理器

以前我们遇到异常时,第一时间想到的应该是try..catch..finnal吧,不过这种方式会导致大量代码重复,维护困难,逻辑臃肿等问题,这不是我们想要的结果。

今天我们要用的全局异常处理方式,用起来是比较简单的。首先新增一个类,增加@RestControllerAdvice注解,该注解的作用花哥上面已经介绍过,就不再唠叨了。

@RestControllerAdvicepublic class CustomerExceptionHandler { &nbsp; &nbsp;}

如果我们有想要拦截的异常类型,就新增一个方法,使用@ExceptionHandler注解修饰,注解参数为目标异常类型。

例如:controller中接口发生Exception异常时,就会进入到Execption方法中进行捕获,将杂乱的异常信息,转换成指定格式后交给ResponseAdvice方法进行统一格式封装并返回给前端小伙伴。

@RestControllerAdvice@Slf4jpublic class CustomerExceptionHandler {    @ExceptionHandler(AuthException.class)    public String ErrorHandler(AuthorizationException e) {        log.error("没有通过权限验证!", e);        return "没有通过权限验证!";    }    @ExceptionHandler(Exception.class)    public Result Execption(Exception e) {        log.error("未知异常!", e);        return Result.error(ResultMsgEnum.SERVER_BUSY.getCode(),ResultMsgEnum.SERVER_BUSY.getMessage());    }}

再次调用接口getUserName查看返回结果,会发现还是有一些问题,因为我们在CustomerExceptionHandler中已经将接口返回结果封装成Result类型,而代码执行到统一结果返回类ResponseAdvice时,又会结果再次封装,就出现了如下问题。

{    "code": 0,    "message": "成功",    "data": {        "code": 503,        "message": "服务器正忙,请稍后再试!",        "data": null    }}
3.4 统一返回结果处理类最终版

解决上述问题非常简单,只要在beforeBodyWrite中增加一条判断即可。

@RestControllerAdvicepublic class ResponseAdvice implements ResponseBodyAdvice<Object> {    @Autowired    private ObjectMapper objectMapper;        @Override    public boolean supports(MethodParameter methodParameter, Class<? extends HttpMessageConverter<?>> aClass) {        return true;    }        @Override    public Object beforeBodyWrite(Object o, MethodParameter methodParameter, MediaType mediaType, Class<? extends HttpMessageConverter<?>> aClass, ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse) {        //处理字符串类型数据        if(o instanceof String){            try {                return objectMapper.writeValueAsString(Result.success(o));            } catch (jsonProcessingException e) {                e.printStackTrace();            }        }        //返回类型是否已经封装        if(o instanceof Result){            return o;        }        return Result.success(o);    }}

以上就是“SpringBoot统一接口返回及全局异常怎么处理”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注编程网精选频道。

--结束END--

本文标题: SpringBoot统一接口返回及全局异常怎么处理

本文链接: https://www.lsjlt.com/news/357955.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • SpringBoot统一接口返回及全局异常怎么处理
    今天小编给大家分享一下SpringBoot统一接口返回及全局异常怎么处理的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。一、S...
    99+
    2023-07-06
  • SpringBoot统一接口返回及全局异常如何处理
    这篇文章主要介绍“SpringBoot统一接口返回及全局异常如何处理”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“SpringBoot统一接口返回及全局异常如何处理”文章能帮助大家解决问题。一、Sp...
    99+
    2023-07-02
  • SpringBoot统一接口返回及全局异常处理高级用法
    目录前言一、SpringBoot不使用统一返回格式1.1 使用字符串返回1.2 使用实体类返回1.3 异常情况下返回二、基础玩法2.1 参数说明2.2 流程说明三、进阶用法3.1 类...
    99+
    2024-04-02
  • Spring Boot统一接口返回及全局异常处理
    目录1、解决方案2、具体实现2.1 定义状态码统一接口2.2 公共模块状态码枚举类2.3 定义全局自定义异常2.4 定义统一接口格式输出类2.5 定义统一接口格式输出类2.6 接口统...
    99+
    2024-04-02
  • Spring Boot统一接口返回及全局异常处理的方法
    这篇文章主要讲解了“Spring Boot统一接口返回及全局异常处理的方法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Spring Boot统一接口返回及全局异常处理的...
    99+
    2023-06-30
  • SpringBoot中如何统一接口返回与全局异常处理详解
    目录背景 统一接口返回 定义API返回码枚举类 定义正常响应的API统一返回体定义异常响应的API统一返回体编写包装返回结果的自定义注解定义返回结果拦截器WebMvc配置类拦截器注册...
    99+
    2024-04-02
  • Springboot项目异常处理及返回结果统一
    目录背景返回结果定义异常的定义异常的处理返回结果的处理完整代码使用示例背景 在创建项目的初期,我们需要规范后端返回的数据结构,以便更好地与前端开发人员合作。 比如后端返回的数据为: ...
    99+
    2022-11-13
    Springboot项目异常处理返回结果统一 Springboot项目异常处理
  • SpringBoot接口如何统一异常处理
    目录为什么要优雅的处理异常实现案例@ControllerAdvice异常统一处理Controller接口运行测试进一步理解@ControllerAdvice还可以怎么用?@Contr...
    99+
    2024-04-02
  • spring boot全局统一返回RESTful风格数据、统一异常处理的方法
    本文小编为大家详细介绍“spring boot全局统一返回RESTful风格数据、统一异常处理的方法”,内容详细,步骤清晰,细节处理妥当,希望这篇“spring boot全局统一返回RESTful风格数据、...
    99+
    2024-04-02
  • Springboot项目全局异常统一处理案例代码
    最近在做项目时需要对异常进行全局统一处理,主要是一些分类入库以及记录日志等,因为项目是基于Springboot的,所以去网络上找了一些博客文档,然后再结合项目本身的一些特殊需求做了些...
    99+
    2023-01-29
    Springboot全局异常处理 Springboot全局异常统一处理 Springboot统一异常处理
  • SpringBoot统一返回处理出现cannot be cast to java.lang.String异常
    SpringBoot统一返回处理出现cannot be cast to java.lang.String异常 一 问题出现背景:二 解决方案三 异常原因分析原因:源码详细分析:正常返回:返回为...
    99+
    2023-10-05
    java spring boot spring
  • SpringBoot中怎么统一全局Controller返回值格式
    这期内容当中小编将会给大家带来有关SpringBoot中怎么统一全局Controller返回值格式,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。一、返回值格式统一1.返回值介绍在使用controller对...
    99+
    2023-06-20
  • springboot实现全局异常处理及自定义异常类
    目录全局异常处理及自定义异常类全局异常处理定义一个业务异常的枚举全局异常处理配置springboot Restful使用springboot 返回 ModelAndView全局异常处...
    99+
    2024-04-02
  • springboot框架的全局异常怎么处理
    这篇文章主要介绍“springboot框架的全局异常怎么处理”,在日常操作中,相信很多人在springboot框架的全局异常怎么处理问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”springboot框架的全局...
    99+
    2023-06-13
  • Spring Boot全局统一异常处理器
    目录一、封装统一返回结果类二、自定义异常封装类三、错误枚举四、全局异常处理类五、测试一、封装统一返回结果类 import com.jiusen.exercise.enums.Er...
    99+
    2024-04-02
  • SpringBoot怎么配置全局异常处理器捕获异常
    本篇内容主要讲解“SpringBoot怎么配置全局异常处理器捕获异常”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“SpringBoot怎么配置全局异常处理器捕获异常”吧!1.前言任何系统,我们不...
    99+
    2023-07-05
  • SpringBoot配置系统全局异常映射处理
    目录一、异常分类 1、业务异常2、系统异常二、解决应用启动后404界面1、引入页面Jar包2、自定义首页接口3、首页界面4、运行效果三、SpringBoot2.0中异常处理...
    99+
    2024-04-02
  • springboot 全局异常处理和统一响应对象的处理方式
    目录springboot异常处理SpringBoot 默认的异常处理机制SpringBoot 全局异常处理1. 局部异常处理2. 全局异常处理自定义异常统一响应对象定义统一的响应对象...
    99+
    2024-04-02
  • springboot如何实现全局异常处理及自定义异常类
    这篇文章主要介绍springboot如何实现全局异常处理及自定义异常类,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!全局异常处理及自定义异常类全局异常处理定义一个处理类,使用@ControllerAdvice注解。@...
    99+
    2023-06-29
  • Spring Boot如何统一处理全局异常
    这篇文章给大家分享的是有关Spring Boot如何统一处理全局异常的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。注解的介绍@ControllerAdvice@ControllerAdvice注解是Sp...
    99+
    2023-06-22
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作