统一返回结果是说,不用在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;
}

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

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. 三、微信小游戏开发 --- 小游戏API调用Platform

    微信小游戏API Platform主要是Egret用于来调用平台的SDK的. 在Egret中使用接口定义Platform. Egret项目中默认的platform值是DebugPlatform. 发布 ...

  2. C# TOKEN的保存与验证

    Token主要为了防止非本页数据的提交,防止重复提交. /** * * 保存TOKEN信息 * */ public void saveToken() { //此处生成md5串 string md5 = ...

  3. 310实验室OTL问题(2)

    1.PyOptimization代码学习心得 (1).该部分由三个分块组成(按完成的相应的任务).第一部分,运行函数. 以optimization.py为入口程序,其思路是:首先获取路径,然后,初始化 ...

  4. Oracle数据类型char与varchar的对比

    使用scott用户连接数据库 新建一个表 create table stu01(name char(32)); 插入一条数据 insert into stu01 values('liuyueming' ...

  5. HDU_2888_Check Corners

    Check Corners Time Limit: 2000/10000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

  6. CentOS下LVM逻辑卷管理技术解释

    1.LVM逻辑卷管理技术产生的背景 企业日益变化的存储需要使得传统的磁盘分区存储显得不够灵活 2.磁盘分区存储 对于这样的三个物理分区的话,迟早有一天会被数据填满,因为它是死的,无法进行缩放. 假设下 ...

  7. python通过os.walk() 遍历出多级目录下所有文件绝对路径

    代码如下 将遍历出来的路径全部添加到列表中: def get_all_abs_path(source_dir): path_list = [] for fpathe, dirs, fs in os.w ...

  8. Unity-DLL反编译学习

        本文由博主(SunboyL)原创,转载请注明出处:http://www.cnblogs.com/xsln/p/DLL_DeCompilation.html     在Unity实际开发过程中, ...

  9. qt——exec()的基本用法

    qt中 if(my1.exec()==QDialog::Accepted) 是什么意思 这个先说这个my1.exec()这个就是个等待消息的循环,就是说它在等待你给的命令. 再说这个QDialog:: ...

  10. python 类 __module__ __class__

    __module__ 和  __class__  __module__ 表示当前操作的对象在那个模块 __class__     表示当前操作的对象的类是什么 创建一个目录lib 在day7 目录下创 ...