文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

SpringBoot中怎么统一全局Controller返回值格式

2023-06-20 18:56

关注

这期内容当中小编将会给大家带来有关SpringBoot中怎么统一全局Controller返回值格式,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。


一、返回值格式统一

1.返回值介绍

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

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

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

@Datapublic 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

SpringBoot中怎么统一全局Controller返回值格式

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

SpringBoot中怎么统一全局Controller返回值格式SpringBoot中怎么统一全局Controller返回值格式

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

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

org.springframework.web.servlet.mvc.method.annotation.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;@Componentpublic 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;    }}

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

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

测试map(无封装)

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

别的方法测试一样

二、附录说明

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

SpringBoot中怎么统一全局Controller返回值格式

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

上述就是小编为大家分享的SpringBoot中怎么统一全局Controller返回值格式了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注编程网行业资讯频道。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯