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

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

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

  1. @PostMapping("GetTask")
  2. public List<TaskResult> GetOpinionTaskHospitals(@RequestParam("month") Date month) {
  3.  
  4. List<TaskResult> result = taskMgrService.GetTask(month, this.getCurrentUser());
  5.  
  6.      return result;
      }

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

  1. @Data
  2. public class AjaxResponse<T> {
  3.  
  4. private Integer status;
  5.  
  6. private String msg;
  7.  
  8. private T data;
  9.  
  10. }

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

  1. {
  2. "status": 200,
  3. "msg": "",
  4. "data": [
  5. {
  6. "id": null,
  7. "hospitalId": "1101",
  8. "hospitalName": "1101"
  9. },
  10. {
  11. "id": null,
  12. "hospitalId": "1102",
  13. "hospitalName": "1102",
  14. },
  15. {
  16. "id": null,
  17. "hospitalId": "1103",
  18. "hospitalName": "1103",
  19. "month": "201602"
  20. }
  21. ]
  22. }

具体实现的方法如下:

  1. @Configuration
  2. public class RestReturnValueHandlerConfigurer implements InitializingBean {
  3. @Autowired
  4. private RequestMappingHandlerAdapter handlerAdapter;
  5.  
  6. @Override
  7. public void afterPropertiesSet() throws Exception {
  8. List<HandlerMethodReturnValueHandler> list = handlerAdapter.getReturnValueHandlers();
  9. List<HandlerMethodReturnValueHandler> newList = new ArrayList<>();
  10. if (list != null) {
  11. for (HandlerMethodReturnValueHandler valueHandler: list) {
  12. if (valueHandler instanceof RequestResponseBodyMethodProcessor) {
  13. HandlerMethodReturnValueHandlerProxy proxy = new HandlerMethodReturnValueHandlerProxy(valueHandler);
  14. newList.add(proxy);
  15. } else {
  16. newList.add(valueHandler);
  17. }
  18. }
  19. }
  20.  
  21. handlerAdapter.setReturnValueHandlers(newList);
  22. }
  23. }
  1. public class HandlerMethodReturnValueHandlerProxy implements HandlerMethodReturnValueHandler {
  2. private HandlerMethodReturnValueHandler proxyObject;
  3.  
  4. public HandlerMethodReturnValueHandlerProxy(HandlerMethodReturnValueHandler proxyObject) {
  5. this.proxyObject = proxyObject;
  6. }
  7.  
  8. @Override
  9. public boolean supportsReturnType(MethodParameter returnType) {
  10. return proxyObject.supportsReturnType(returnType);
  11. }
  12.  
  13. @Override
  14. public void handleReturnValue(Object returnValue, MethodParameter returnType, ModelAndViewContainer mavContainer,
  15. NativeWebRequest webRequest) throws Exception {
  16. AjaxResponse response = new AjaxResponse();
  17.  
  18. response.setStatus(STATUS_CODE_SUCCEEDED);
  19. response.setMsg("");
  20. response.setData(returnValue);
  21. proxyObject.handleReturnValue(response, returnType, mavContainer, webRequest);
  22. }
  23.  
  24. private static final int STATUS_CODE_SUCCEEDED = 200;
  25. }

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

springboot2 统一返回结果的更多相关文章

  1. Spring统一返回Json工具类,带分页信息

    前言: 项目做前后端分离时,我们会经常提供Json数据给前端,如果有一个统一的Json格式返回工具类,那么将大大提高开发效率和减低沟通成本. 此Json响应工具类,支持带分页信息,支持泛型,支持Htt ...

  2. Spring Boot 2.x(六):优雅的统一返回值

    目录 为什么要统一返回值 ReturnVO ReturnCode 使用ReturnVO 使用AOP进行全局异常的处理 云撸猫 公众号 为什么要统一返回值 在我们做后端应用的时候,前后端分离的情况下,我 ...

  3. springboot2 统一异常处理

    统一异常处理,不需要在每一层上单独捕获异常,只需要关注业务的开发: 代码如下: @RestControllerAdvice @Slf4j public class GlobalExceptionHan ...

  4. mb_strlen(,utf-8);可以除去中文字符,统一返回是几个字符

    mb_strlen(,utf-8);可以除去中文字符,统一返回是几个字符

  5. springboot之全局处理统一返回

    springboot之全局处理统一返回 简介 在REST风格的开发中,避免通常会告知前台返回是否成功以及状态码等信息.这里我们通常返回的时候做一次util的包装处理工作,如:Result类似的类,里面 ...

  6. spring boot 2 全局统一返回RESTful风格数据、统一异常处理

    全局统一返回RESTful风格数据,主要是实现ResponseBodyAdvice接口的方法,对返回值在输出之前进行修改.使用注解@RestControllerAdvice拦截异常并统一处理. 开发环 ...

  7. ASP.NET Core 2.2 WebApi 系列【八】统一返回格式(返回值、模型验证、异常)

    现阶段,基本上都是前后端分离项目,这样一来,就需要前后端配合,没有统一返回格式,那么对接起来会很麻烦,浪费时间.我们需要把所有接口及异常错误信息都返回一定的Json格式,有利于前端处理,从而提高了工作 ...

  8. springboot统一返回json数据格式并配置系统异常拦截

    本文链接:https://blog.csdn.net/syystx/article/details/82870217通常进行前后端分离开发时我们需要定义统一的json数据交互格式并对系统未处理异常进行 ...

  9. webapi接口统一返回请求时间

    webapi接口统一返回请求时间: public class BaseController : ControllerBase { protected ReturnResult<T> Res ...

随机推荐

  1. 3.node的url属性

    node的url属性 1.parse: [Function: urlParse],2.format: [Function: urlFormat],3.resolve: [Function: urlRe ...

  2. 【BZOJ3262】陌上花开 cdq分治

    [BZOJ3262]陌上花开 Description 有n朵花,每朵花有三个属性:花形(s).颜色(c).气味(m),又三个整数表示.现要对每朵花评级,一朵花的级别是它拥有的美丽能超过的花的数量.定义 ...

  3. highmaps如何自定义 区间的颜色刻度

    https://api.highcharts.com/highmaps/colorAxis.dataClassColor http://jsfiddle.net/gh/get/library/pure ...

  4. Swift - 把汉字转换为拼音,并且截取首字母做索引用

    var transformContents = CFStringCreateMutableCopy(nil, 0, "咋啊的看到回复阿斯顿发货发哦iasdifas") CFStri ...

  5. 树链剖分+离散+扫描(HDU5044)

    Tree Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Subm ...

  6. (贪心)kruskal思想

    hdu4313 Matrix Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) T ...

  7. Oracle HA 之 基于活动数据库复制配置oracle 11.2 dataguard

    规划:主库:db_name=dbking               db_unique_name=dbkingpri               备库:db_name=dbking          ...

  8. fork(2) - Linux man page

    fork(2): create child process - Linux man page https://linux.die.net/man/2/fork fork(2) - Linux man ...

  9. UEM用户行为了如指掌!

    “千呼万唤始出来”,万众期待的UEM正式与宝宝们见面啦~~~ 今天很多人来问小编,Web咋不见了,表急,Web并没有消失,而是重磅升级为UEM啦!!! 什么是UEM呢?UEM全称User Experi ...

  10. Disruptor的伪共享解决方案

    1.术语 术语 英文单词 描述 内存屏障 Memory Barriers 是一组处理器指令,用于实现对内存操作的顺序限制. In the Java Memory Model a volatile fi ...