iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >SpringBoot全局Controller返回值格式统一
  • 510
分享到

SpringBoot全局Controller返回值格式统一

2024-04-02 19:04:59 510人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

目录一、返回值格式统一1.返回值介绍2.基础类功能3.基础实现二、附录说明一、返回值格式统一 1.返回值介绍 在使用controller对外提供服务的时候,很多时候都需要统一返回值格

一、返回值格式统一

1.返回值介绍

在使用controller对外提供服务的时候,很多时候都需要统一返回值格式,例如


{
	"status": true,
	"message": null,
	"code": "200",
	"data": {
		"name": "JSON",
		"desc": "json返回值"
	}
}

如果不使用全局统一返回,就需要写一个工具类,然后controller返回对应的对象


@Data
public class ResponseData {
    private boolean status;
    private String message;
    private String code;
    private Object data;
}

@RequestMapping("/foo")
public ResponseData foo() {
    // 或者使用工具类返回,根据业务设置值
    return new ResponseData();
}

除了上述方法,可以对返回值进行统一处理,不需要对所有controller都使用一个返回值,controller只需要返回原始值,处理器会对返回值进行封装

同时也可以添加自定义注解,此注解用于忽略返回值封装,按照controller原始值返回

2.基础类功能

org.springframework.WEB.method.support.HandlerMethodReturnValueHandler

  • 使用不同策略处理从调用处理程序方法的返回值
  • 策略处理顶层接口,自定义返回值格式需要实现此接口
  • supportsReturnType:设置支持返回值类型
  • handleReturnValue:处理返回值基础参数

在这里插入图片描述

org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter

  • 请求映射处理适配,包含了参数、返回值处理器等信息
  • HandlerMethodReturnValueHandlerComposite内部维护了HandlerMethodReturnValueHandler列表

在这里插入图片描述在这里插入图片描述

可以自定义注解,用于类或者方法级别忽略返回值封装


@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface IgnoreResponseWrapper {

}

org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor

  • 属于HandlerMethodReturnValueHandler子类
  • 主要功能是对请求和响应体的做处理的方法
  • 所有属于RequestResponseBodyMethodProcessor的子类都需要替换为自定义返回值处理

实现原理就是,在bean初始化的时候,获取到所有处理器数组,然后将所有是RequestResponseBodyMethodProcessor处理器子类对返回值处理的过程替换为自定义处理器

处理这样当调用对应返回值处理器时,将会使用到自定义的返回值处理器,也就是所有返回值都会按照规定的进行处理

3.基础实现

创建普通SpringBoot项目,项目创建在此不做说明

创建类实现HandlerMethodReturnValueHandler接口,主要用于实现自定义返回值内容,不需要注入容器


import com.codecoord.unifyreturn.annotation.IgnoreResponseWrapper;
import com.codecoord.unifyreturn.domain.ResponseBase;
import org.springframework.core.MethodParameter;
import org.springframework.web.context.request.NativeWebRequest;
import org.springframework.web.method.support.HandlerMethodReturnValueHandler;
import org.springframework.web.method.support.ModelAndViewContainer;

public class ResponseBodyWrapHandler implements HandlerMethodReturnValueHandler {
    private final HandlerMethodReturnValueHandler delegate;

    public ResponseBodyWrapHandler(HandlerMethodReturnValueHandler delegate) {
        this.delegate = delegate;
    }

    @Override
    public boolean supportsReturnType(MethodParameter returnType) {
        return delegate.supportsReturnType(returnType);
    }

    @Override
    public void handleReturnValue(Object returnValue,
                                  MethodParameter returnType,
                                  ModelAndViewContainer mavContainer,
                                  NativeWebRequest webRequest) throws Exception {
        // 如果类或者方法含有不包装注解则忽略包装
        IgnoreResponseWrapper wrapper = returnType.getDeclarinGClass().getAnnotation(IgnoreResponseWrapper.class);
        if (wrapper != null) {
            delegate.handleReturnValue(returnValue, returnType, mavContainer, webRequest);
            return;
        }
        wrapper = returnType.getMethodAnnotation(IgnoreResponseWrapper.class);
        if (wrapper != null) {
            delegate.handleReturnValue(returnValue, returnType, mavContainer, webRequest);
            return;
        }
        
        // 自定义返回格式
        ResponseBase responseBase = new ResponseBase();
        responseBase.setStatus(true);
        responseBase.setCode("200");
        responseBase.setData(returnValue);
        delegate.handleReturnValue(responseBase, returnType, mavContainer, webRequest);
    }
}

创建类实现InitializingBean,在初始化时调用,需要注入到容器中,否则Spring无法管理


import java.util.ArrayList;
import java.util.List;

@Component
public class ResponseBodyWrapFactoryBean implements InitializingBean {
    private final RequestMappingHandlerAdapter adapter;

    @Autowired
    public ResponseBodyWrapFactoryBean(RequestMappingHandlerAdapter adapter) {
        this.adapter = adapter;
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        List<HandlerMethodReturnValueHandler> returnValueHandlers = adapter.getReturnValueHandlers();
        if (returnValueHandlers.size() > 0) {
        	// 将内置的返回值处理器进行替换
            List<HandlerMethodReturnValueHandler> handlers = new ArrayList<>(returnValueHandlers);
            decorateHandlers(handlers);
            adapter.setReturnValueHandlers(handlers);
        }
    }

    
    private void decorateHandlers(List<HandlerMethodReturnValueHandler> handlers) {
        for (HandlerMethodReturnValueHandler handler : handlers) {
            if (handler instanceof RequestResponseBodyMethodProcessor) {
            	// 替换为自定义返回值处理器
                ResponseBodyWrapHandler decorator = new ResponseBodyWrapHandler(handler);
                int index = handlers.indexOf(handler);
                handlers.set(index, decorator);
                break;
            }
        }
    }
}

创建controller信息,例如此处map不需要封装,按照原来格式响应


@RestController
@RequestMapping("/unify")
public class UnifyReturnValueController {

    @RequestMapping("string")
    public String stringHandler(){
        return "接收成功了";
    }

    @RequestMapping("/json")
    public JSONObject jsonHandler(){
        JSONObject object = new JSONObject();
        object.put("name", "json");
        object.put("desc", "json返回值");
        return object;
    }

    @RequestMapping("/map")
    @IgnoreResponseWrapper
    public Map<String, Object> mapHandler(){
        Map<String, Object> map = new HashMap<>(10);
        map.put("name", "map");
        map.put("desc", "map返回值");
        return map;
    }

    @RequestMapping("/list")
    public List<Object> listHandler(){
        List<Object> data = new ArrayList<>();
        data.add(100);
        data.add(95);
        data.add(99);
        return data;
    }
}

4.测试信息 测试json(有封装)


{
	"status": true,
	"message": null,
	"code": "200",
	"data": {
		"name": "json",
		"desc": "json返回值"
	}
}

测试map(无封装)


{
	"name": "map",
	"desc": "map返回值"
}

别的方法测试一样

二、附录说明

项目结构参考红框部分,别的忽略

在这里插入图片描述

除了对返回值进行全局统一,也可以对异常进行全局处理和按照统一格式返回

到此这篇关于SpringBoot全局Controller返回值格式统一的文章就介绍到这了,更多相关SpringBoot返回值格式统一内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: SpringBoot全局Controller返回值格式统一

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

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

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

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

下载Word文档
猜你喜欢
  • SpringBoot全局Controller返回值格式统一
    目录一、返回值格式统一1.返回值介绍2.基础类功能3.基础实现二、附录说明一、返回值格式统一 1.返回值介绍 在使用controller对外提供服务的时候,很多时候都需要统一返回值格...
    99+
    2022-11-12
  • SpringBoot中怎么统一全局Controller返回值格式
    这期内容当中小编将会给大家带来有关SpringBoot中怎么统一全局Controller返回值格式,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。一、返回值格式统一1.返回值介绍在使用controller对...
    99+
    2023-06-20
  • 关于springboot的接口返回值统一标准格式
    目录一、目标二、为什么要对springboot的接口返回值统一标准格式第一种格式:response为String第二种格式:response为Objct第三种格式:response为...
    99+
    2022-11-13
  • SpringBoot如何统一后端返回格式
    这篇文章主要讲解了“SpringBoot如何统一后端返回格式”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“SpringBoot如何统一后端返回格式”吧!目录为什么要对SpringBoot返回...
    99+
    2023-06-20
  • 一文学会处理SpringBoot统一返回格式
    目录背景SpringBoot Controller 常见的返回格式String自定义对象正常返回错误返回定义返回对象定义状态枚举统一处理返回值及异常void 无返回值有返回值背景 相...
    99+
    2022-11-13
    SpringBoot统一返回格式  统一返回格式
  • SpringBoot统一返回格式的方法详解
    目录前言1. 直接返回结果2. 约定返回格式3. 返回统一格式结果4. 切片封装统一格式编写注解编写ControllerAdvice见证奇迹的时刻到了5. 自定义返回格式场景1:返回...
    99+
    2022-11-13
  • 详解SpringBoot如何统一后端返回格式
    目录为什么要对SpringBoot返回统一的标准格式第一种:返回 String第二种:返回自定义对象第三种:接口异常定义返回标准格式高级实现方式接口异常问题SpringBoot为什么...
    99+
    2022-11-12
  • SpringBoot怎么实现统一后端返回格式
    这篇文章主要介绍“SpringBoot怎么实现统一后端返回格式”,在日常操作中,相信很多人在SpringBoot怎么实现统一后端返回格式问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”SpringBoot怎么实...
    99+
    2023-06-30
  • SpringBoot统一返回JSON格式实现方法详解
    目录定义JSON格式定义JavaBean字段定义返回体类Result实体返回测试统一返回JSON格式进阶全局处理(@RestControllerAdvice)@ResponseBod...
    99+
    2023-02-03
    SpringBoot返回JSON格式 SpringBoot无侵入式返回JSON格式
  • 详解SpringBoot 统一后端返回格式的方法
    目录为什么要对SpringBoot返回统一的标准格式定义返回标准格式定义返回对象定义状态码统一返回格式高级实现方式接口异常问题SpringBoot为什么需要全局异常处理器如何实现全局...
    99+
    2022-11-13
  • SpringBoot统一接口返回及全局异常怎么处理
    今天小编给大家分享一下SpringBoot统一接口返回及全局异常怎么处理的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。一、S...
    99+
    2023-07-06
  • SpringBoot统一接口返回及全局异常如何处理
    这篇文章主要介绍“SpringBoot统一接口返回及全局异常如何处理”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“SpringBoot统一接口返回及全局异常如何处理”文章能帮助大家解决问题。一、Sp...
    99+
    2023-07-02
  • SpringBoot返回统一的JSON标准格式实现步骤
    期望返回的JSON格式如下 { "code": 200, "msg": "操作成功", "data": "hello jenkins" } 实现步骤如下 1.自定义...
    99+
    2022-11-12
  • 详解SpringBoot如何实现统一后端返回格式
    目录1.为什么要对SpringBoot返回统一的标准格式1.1 返回String1.2 返回自定义对象1.3 接口异常2.定义返回对象3.定义状态码4.统一返回格式5.高级实现方式5...
    99+
    2022-11-13
  • .NetCore Web Api怎么用ActionFilterAttribute统一接口返回值格式
    本文小编为大家详细介绍“.NetCore Web Api怎么用ActionFilterAttribute统一接口返回值格式”,内容详细,步骤清晰,细节处理妥当,希望这篇“.NetCore Web Ap...
    99+
    2023-06-29
  • SpringBoot统一接口返回及全局异常处理高级用法
    目录前言一、SpringBoot不使用统一返回格式1.1 使用字符串返回1.2 使用实体类返回1.3 异常情况下返回二、基础玩法2.1 参数说明2.2 流程说明三、进阶用法3.1 类...
    99+
    2022-11-13
  • springboot怎么配置Jackson返回统一默认值
    这篇文章主要介绍“springboot怎么配置Jackson返回统一默认值”,在日常操作中,相信很多人在springboot怎么配置Jackson返回统一默认值问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”s...
    99+
    2023-06-20
  • 怎么在SpringBoot中统一api的返回风格
    怎么在SpringBoot中统一api的返回风格?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。例如{ "code": 200,&nb...
    99+
    2023-06-07
  • spring boot全局统一返回RESTful风格数据、统一异常处理的方法
    本文小编为大家详细介绍“spring boot全局统一返回RESTful风格数据、统一异常处理的方法”,内容详细,步骤清晰,细节处理妥当,希望这篇“spring boot全局统一返回RESTful风格数据、...
    99+
    2022-10-19
  • SpringBoot中如何统一接口返回与全局异常处理详解
    目录背景 统一接口返回 定义API返回码枚举类 定义正常响应的API统一返回体定义异常响应的API统一返回体编写包装返回结果的自定义注解定义返回结果拦截器WebMvc配置类拦截器注册...
    99+
    2022-11-12
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作