zoukankan      html  css  js  c++  java
  • springboot2 统一返回结果

    统一返回结果是说,不用在controller层,new一个对象,或用工厂创建这个对象,再返回这个对象,而是这个Action该返回什么就返回什么,

    我们再通过mvc的流程,再对返回对象做进一步的封装,以达到我们的目的。

    以下是controller层代码:我们返回一个list

        @PostMapping("GetTask")
        public List<TaskResult> GetOpinionTaskHospitals(@RequestParam("month") Date month) {
    
             List<TaskResult> result = taskMgrService.GetTask(month, this.getCurrentUser()); 

         return result;
      }

    通常的webapi的返回结果中都会有一个是否成功的标识,还有状态码,错误消息,还有返回结果对象,如下列的代码:

    @Data
    public class AjaxResponse<T> {
    
        private Integer status;
    
        private String msg;
    
        private T data;
    
    }

    最终返回的结果是这样的:

    {
      "status": 200,
      "msg": "",
      "data": [
        {
          "id": null,
          "hospitalId": "1101",
          "hospitalName": "1101"
        },
        {
          "id": null,
          "hospitalId": "1102",
          "hospitalName": "1102",
        },
        {
          "id": null,
          "hospitalId": "1103",
          "hospitalName": "1103",
          "month": "201602"
        }
      ]
    }

    具体实现的方法如下:

    @Configuration
    public class RestReturnValueHandlerConfigurer implements InitializingBean {
        @Autowired
        private RequestMappingHandlerAdapter handlerAdapter;
    
        @Override
        public void afterPropertiesSet() throws Exception {
            List<HandlerMethodReturnValueHandler> list = handlerAdapter.getReturnValueHandlers();
            List<HandlerMethodReturnValueHandler> newList = new ArrayList<>();
            if (list != null) {
                for (HandlerMethodReturnValueHandler valueHandler: list) {
                    if (valueHandler instanceof RequestResponseBodyMethodProcessor) {
                        HandlerMethodReturnValueHandlerProxy proxy = new HandlerMethodReturnValueHandlerProxy(valueHandler);
                        newList.add(proxy);
                    } else {
                        newList.add(valueHandler);
                    }
                }
            }
    
            handlerAdapter.setReturnValueHandlers(newList);
        }
    }
    public class HandlerMethodReturnValueHandlerProxy implements HandlerMethodReturnValueHandler {
        private HandlerMethodReturnValueHandler proxyObject;
    
        public HandlerMethodReturnValueHandlerProxy(HandlerMethodReturnValueHandler proxyObject) {
            this.proxyObject = proxyObject;
        }
    
        @Override
        public boolean supportsReturnType(MethodParameter returnType) {
            return proxyObject.supportsReturnType(returnType);
        }
    
        @Override
        public void handleReturnValue(Object returnValue, MethodParameter returnType, ModelAndViewContainer mavContainer,
                                      NativeWebRequest webRequest) throws Exception {
            AjaxResponse response = new AjaxResponse();
    
            response.setStatus(STATUS_CODE_SUCCEEDED);
            response.setMsg("");
            response.setData(returnValue);
            proxyObject.handleReturnValue(response, returnType, mavContainer, webRequest);
        }
    
        private static final int STATUS_CODE_SUCCEEDED = 200;
    }

    统一返回的结果与异常返回的结果是同一对象 ,请参考上一篇统一异常返回。

  • 相关阅读:
    win10 免费屏幕录像工具下载
    普通人如何在“元宇宙”中获取红利?
    CMake语法—函数(定义&调用)
    CMake语法—普通变量与子目录(Normal Variable And Subdirectory)
    CMake语法—函数(解析参数 PARSE_ARGV)
    算法set_intersection、set_union、set_difference
    CMake语法—缓存变量(Cache Variable)
    C++ 求时差
    CMake语法—环境变量(Environment Variable)
    CMake语法—普通变量与函数(Normal Variable And Function)
  • 原文地址:https://www.cnblogs.com/hankuikui/p/10239939.html
Copyright © 2011-2022 走看看