一文教你处理SpringBoot统一返回格式

这篇具有很好参考价值的文章主要介绍了一文教你处理SpringBoot统一返回格式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

背景

相信大部分后端开发人员在日常开发中都需要和前端对接,当然前后端都是你自己一个人搞的话可以想怎么玩就怎么玩,但是我们还是要做到一定的规范性。在前后端分离的项目中后端返回的格式一定要友好,并且固定,不能经常变来变去,不然会对前端的开发人员带来很多的工作量。

SpringBoot Controller 常见的返回格式

String

@PostMapping("/test")
public String test(){
    return "Hello World";
}
复制代码

postman调用结果:

一文教你处理SpringBoot统一返回格式

自定义对象

正常返回

    @PostMapping("/getUser")
    public ActionResult getUser(){
        User user = new User();
        user.setId(UUID.randomUUID().toString());
        user.setName("MrDong");
        user.setAge(20);
        return ActionResult.defaultOk(user);
    }
复制代码

postman调用结果:

一文教你处理SpringBoot统一返回格式

错误返回

   @PostMapping("/error")
    public ActionResult error(){
        return ActionResult.defaultFail(1000,"服务器异常,请联系管理员");
    }
复制代码

postman调用结果:

一文教你处理SpringBoot统一返回格式

定义返回对象

我定义两个ActionResult这个对象来对返回值进行封装,可以根据自己公司实际情况修改:

package com.wxd.entity;

import com.wxd.enums.ResultCodeEnum;
import lombok.Data;

/**
 * @ClassName ActionResult
 * @Description 统一返回值封装
 * @Author Mr Dong
 * @Date 2022/7/26 14:51
 */
@Data
public class ActionResult {

    private Integer code;
    private String msg;
    private Integer count;
    private Object data;

    public static ActionResult defaultOk(Integer code, String msg, Integer count, Object data) {
        return new ActionResult(code, msg, count, data);
    }

    public static ActionResult defaultOk(Integer count, Object data) {
        return new ActionResult(ResultCodeEnum.RC200, count, data);
    }

    public static ActionResult defaultOk(Object data) {
        return new ActionResult(ResultCodeEnum.RC200, null, data);
    }

    public static ActionResult defaultOk() {
        return new ActionResult(ResultCodeEnum.RC200);
    }

    public static ActionResult defaultFail() {
        return new ActionResult(ResultCodeEnum.RC999);
    }

    public static ActionResult defaultFail(Integer code, String msg) {
        return new ActionResult(code, msg);
    }

    public static ActionResult defaultFail(ResultCodeEnum resultCodeEnum) {
        return new ActionResult(resultCodeEnum);
    }

    public ActionResult(Integer code, String msg, Integer count, Object data) {
        this.code = code;
        this.msg = msg;
        this.count = count;
        this.data = data;
    }

    public ActionResult(Integer code, String msg) {
        this.code = code;
        this.msg = msg;
    }

    public ActionResult(ResultCodeEnum resultCodeEnum) {
        this.code = resultCodeEnum.getCode();
        this.msg = resultCodeEnum.getMessage();
    }

    public ActionResult(ResultCodeEnum resultCodeEnum, Integer count, Object data) {
        this.code = resultCodeEnum.getCode();
        this.msg = resultCodeEnum.getMessage();
        this.count = count;
        this.data = data;
    }

}
复制代码

定义状态枚举

package com.wxd.enums;

/**
 * @author wxd
 * @version V1.0
 * @description ResultCodeEnum
 * @date 2022/8/10 13:35
 **/
public enum ResultCodeEnum {
    /**
     * 操作成功
     */
    RC200(200, "操作成功"),
    /**
     * 未授权
     */
    RC401(401, "用户未授权"),
    /**
     * 请求被禁止
     */
    RC403(403, "请求被禁止"),
    /**
     * 服务异常
     */
    RC500(500, "服务器异常,请联系管理员"),
    /**
     * 操作失败
     */
    RC999(999, "操作失败"),

    RC1001(1001, "用户名密码错误"),
    RC1002(1002, "未授权的资源"),
    RC1003(1003, "未授权的资源"),
    RC1004(1004, "缺少请求参数异常"),
    RC1005(1005, "缺少请求体参数异常"),
    RC1006(1006, "参数绑定异常"),
    RC1007(1007, "方法参数无效异常");

    private Integer code;
    private String message;

    ResultCodeEnum(Integer code, String message) {
        this.code = code;
        this.message = message;
    }

    public Integer getCode() {
        return code;
    }

    public String getMessage() {
        return message;
    }
}
复制代码

统一处理返回值及异常

实现原理:需要实现SpringBoot提供的ResponseBodyAdvice这个接口,完成统一返回值的封装及异常的处理。实现了这个接口之后,在Controller返回的时候只需要将对象直接返回,有些不需要返回值的可以直接返回void。

package com.wxd.advice;

import com.wxd.entity.ActionResult;
import com.wxd.enums.ResultCodeEnum;
import lombok.extern.slf4j.Slf4j;
import org.springframework.core.MethodParameter;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.converter.HttpMessageNotReadableException;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.validation.BindException;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.MissingServletRequestParameterException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;

/**
 * @version: V1.0
 * @author: wxd
 * @description: 全局异常处理以及返回值的统一封装
 * @Date 2022/7/26 16:24
 */
@RestControllerAdvice(value = "com.wxd.controller")
@Slf4j
public class ResponseAdvice implements ResponseBodyAdvice {

    @Override
    public boolean supports(MethodParameter methodParameter, Class aClass) {
        return true;
    }

    /**
     * 统一包装
     *
     * @param o
     * @param methodParameter
     * @param mediaType
     * @param aClass
     * @param serverHttpRequest
     * @param serverHttpResponse
     * @return
     */
    @Override
    public Object beforeBodyWrite(Object o, MethodParameter methodParameter, MediaType mediaType, Class aClass, ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse) {
        /**
         * String、ActionResult不需要再包一层(不想包一层ActionResult对象的可以在这里把这个对象过滤掉)
         */
        if (o instanceof String || o instanceof ActionResult) {
            return o;
        }
        return ActionResult.defaultOk(o);
    }

    /**
     * 系统内部异常捕获
     *
     * @param e
     * @return
     */
    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
    @ExceptionHandler(value = Exception.class)
    public Object exceptionHandler(Exception e) {
        log.error("系统内部异常,异常信息", e);
        return ActionResult.defaultFail(ResultCodeEnum.RC500);
    }


    /**
     * 忽略参数异常处理器;触发例子:带有@RequestParam注解的参数未给参数
     *
     * @param e 忽略参数异常
     * @return ResponseResult
     */
    @ResponseStatus(HttpStatus.BAD_REQUEST)
    @ExceptionHandler(MissingServletRequestParameterException.class)
    public Object parameterMissingExceptionHandler(MissingServletRequestParameterException e) {
        log.error("缺少Servlet请求参数异常", e);
        return ActionResult.defaultFail(ResultCodeEnum.RC1004);
    }

    /**
     * 缺少请求体异常处理器;触发例子:不给请求体参数
     *
     * @param e 缺少请求体异常
     * @return ResponseResult
     */
    @ResponseStatus(HttpStatus.BAD_REQUEST)
    @ExceptionHandler(HttpMessageNotReadableException.class)
    public Object parameterBodyMissingExceptionHandler(HttpMessageNotReadableException e) {
        log.error("参数请求体异常", e);
        return ActionResult.defaultFail(ResultCodeEnum.RC1005);
    }


    /**
     * 统一处理请求参数绑定错误(实体对象传参);
     *
     * @param e BindException
     * @return ResponseResult
     */
    @ResponseStatus(HttpStatus.BAD_REQUEST)
    @ExceptionHandler(BindException.class)
    public Object validExceptionHandler(BindException e) {
        log.error("方法参数绑定错误(实体对象传参)", e);
        return ActionResult.defaultFail(ResultCodeEnum.RC1006);
    }

    /**
     * 统一处理请求参数绑定错误(实体对象请求体传参);
     *
     * @param e 参数验证异常
     * @return ResponseResult
     */
    @ResponseStatus(HttpStatus.BAD_REQUEST)
    @ExceptionHandler({MethodArgumentNotValidException.class})
    public Object parameterExceptionHandler(MethodArgumentNotValidException e) {
        log.error("方法参数无效异常(实体对象请求体传参)", e);
        return ActionResult.defaultFail(ResultCodeEnum.RC1007);
    }

}
复制代码

void 无返回值

一文教你处理SpringBoot统一返回格式

有返回值

一文教你处理SpringBoot统一返回格式

 文章来源地址https://www.toymoban.com/news/detail-506151.html

到了这里,关于一文教你处理SpringBoot统一返回格式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Springboot 设置统一的请求返回格式

    现在开发过程中主要采用前后端分离的方式进行开发测试,也就是前端封装请求,后端提供标准的API接口服务。一般现在json 格式受到开发者们的青睐,学习过程中我们可以设置接口的返回类型,那么怎么做到设置统一的返回格式呢?以下是在项目开发过程中一般的模式标准

    2024年02月13日
    浏览(28)
  • Spring Boot 统一功能处理(拦截器实现用户登录权限的统一校验、统一异常返回、统一数据格式返回)

    目录 1. 用户登录权限校验 1.1 最初用户登录权限效验 1.2 Spring AOP 用户统⼀登录验证 1.3 Spring 拦截器 (1)创建自定义拦截器 (2)将自定义拦截器添加到系统配置中,并设置拦截的规则 1.4 练习:登录拦截器 (1)实现 UserController 实体类 (2)返回的登录页面:login.html (3)实

    2024年02月12日
    浏览(34)
  • 【Spring Boot】拦截器与统一功能处理:统一登录验证、统一异常处理与统一数据返回格式

     Spring AOP是一个基于面向切面编程的框架,用于将横切性关注点(如日志记录、事务管理)与业务逻辑分离,通过代理对象将这些关注点织入到目标对象的方法执行前后、抛出异常或返回结果时等特定位置执行,从而提高程序的可复用性、可维护性和灵活性。但使用原生Sp

    2024年02月16日
    浏览(33)
  • Spring Boot 统一数据返回格式 分析 和 处理

    目录 实现统一数据格式  测试   原因分析  解决方案 🎥 个人主页:Dikz12 📕格言:吾愚多不敏,而愿加学 欢迎大家👍点赞✍评论⭐收藏 统⼀的数据返回格式使⽤ @ControllerAdvice 和 ResponseBodyAdvice 的⽅式实现; @ControllerAdvice : 表⽰控制器通知类. 比如:添加类 ResponseAdvic

    2024年04月08日
    浏览(40)
  • 【Spring Boot统一功能处理】统一异常处理,统一的返回格式,@ControllerAdvice简单分析,即将走进SSM项目的大门! ! !

    前言: 大家好,我是 良辰丫 ,在上一篇文章中我们已经学习了一些统一功能处理的相关知识,今天我们继续深入学习这些知识,主要学习统一异常处理,统一的返回格式,@ControllerAdvice简单分析.💌💌💌 🧑个人主页:良辰针不戳 📖所属专栏:javaEE进阶篇之框架学习 🍎励志语句:生

    2024年02月16日
    浏览(33)
  • springboot全局统一返回处理

    项目中一般都会有规定好的接口返回格式,无论成功与失败,一般格式都是不变的,这样是为了方便前后端统一处理,今天就来说下前后端统一处理的较为优雅的方式; 一般而言都会有一个统一的返回类作为接口的返回数据的封装,例如: 然后我们通过此类作为返回参数的统一封装

    2024年02月13日
    浏览(30)
  • 【规范】SpringBoot接口返回结果及异常统一处理,这样封装才优雅

    博友的需求就是我最大的动力 博友一说话,本狗笑哈哈。 博友要我写啥,我就写啥 。 特来一篇关于 SpringBoot接口返回结果及异常统一处理 ,虽说封不封装都能用,但咱后端也得给前端小姐姐留个好印象不是。项目前后端分离, 规范的数据传输格式,让REST风格的API具有简单

    2024年02月08日
    浏览(33)
  • 如何设计 API 接口,实现统一格式返回?

    在移动互联网,分布式,微服务盛行的今天,现在项目绝大部分都采用的微服务框架,前分离分离方式,(题外话:前重新的工作分配越来越明确,现在的前端都称为大前端,技术栈以及生态圈都已经非常成熟;以前官员人员瞧不起前端人员,那现在高层人员要重新认识一下

    2024年02月12日
    浏览(35)
  • SSMP整合案例(9) 统一表现层数据返回格式

    上文 SSMP整合案例(8) Restful开发表现层接口 我们就已经是把表现层的接口写完了 但是 我们会发现 现在前端人员拿到我们的数据 格式看着非常的乱 我们 数据库 添加 修改 删除 就是但数据的格式 一个 布尔值 查询 就是 查多个 一个集合 查询 全部 则就是 一个对象的格式 还有

    2024年02月12日
    浏览(31)
  • 在前后端分离项目中如何设置统一返回格式

    目录 一、步骤一 二、步骤二 在前后端分离的项目中,为了方便前后端交互,后端往往需要给前端返回固定的数据格式,但不同的实体类返回格式不同,所以在真实开发中,我们将所有API接口设置返回统一的格式。基本上包括的有状态码,提示信息和数据等等。下面是基本的

    2024年02月22日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包