Springmv SpringBoot Restful接口返回结果统一封装统一异常封装

问题背景

  • 在web开发过程中,我们常常会提供两类接口。一类是内部接口,这类接口主要为web页面服务的,web前端可以通过ajax等手段进行后台数据的获取并渲染页面;另一类接口主要是供第三方使用,以便于与第三方系统集成。
  • 但不管是哪一种接口,不管返回数据内容如何千变万化, 为了保证返回数据的可读性,通常都会采用统一的格式封装数据值。
    期望封装格式如下:
{
“data”: Obj,
“errorCode”: 0,
“message”: “数据获取成功”
}
  • 这样一来,不管接口获取的是什么数据(文件流、字符串(非json形式的字符串)除外),序列化后的数据本身都仅仅是一个更大的json对象的data字段而已,与data字段处于同一级别的额外信息还包括errorCode、message、success等字段。
  • 采用统一的数据格式封装数据的好处不言而喻。比如在ajax调用数据成功以后,ajax根据返回的数据的errorCode字段是0还是其他错误编码,分别弹出不同颜色的提示框,以便区分数据到底是获取成功还是获取失败。
  • 然后,这个弹出的提示框往往会有一条提示信息,以便让用户知道,这个接口是什么原因导致调用失败的,而用于渲染提示框的提示信息,一般就取自message字段。

使用springmvc实现结果统一装配

从spring mvc 4.0起引入RequestBodyAdvice和ResponseBodyAdvice这两个接口。

  • RequestBodyAdvice主要用于对请求参数的增强处理。
  • ResponseBodyAdvice用于对响应参数的增强处理。
  1. 实现ResponseBodyAdvice
    在这里插入图片描述
    supports方法实现表明,只有序列化框架是Jackson才对返回结果进行增强,具体项目中使用了哪一种序列化框架,修改该方法的实现即可。
    在这里插入图片描述
    beforeBodyWrite方法表明,Jackson序列化框架序列化的是增强的结果对象,而不是Restful接口方法返回值代表的那个对象。
    Springmv SpringBoot Restful接口返回结果统一封装统一异常封装_第1张图片
  2. 增加@ControllerAdvice注解,由Spring管理
    在这里插入图片描述
  3. 代码对比
    先看统一返回前的代码:
    Springmv SpringBoot Restful接口返回结果统一封装统一异常封装_第2张图片
    统一返回后的:
    Springmv SpringBoot Restful接口返回结果统一封装统一异常封装_第3张图片
    如上述代码所示,使用springmvc的结果统一装配功能后,对于有返回值的方法,需要返回什么类型的数据,则直接返回指定类型的对象实例即可。逻辑清晰明了,不需要每一个方法都返回千篇一律的MessageBean对象。

异常处理统一封装

  1. 创建异常处理工具类
    增加BaseExceptionHandleAction类,并在类中同时使用@ExceptionHandler和@ResponseBody注解声明异常处理,示例代码如下:
    Springmv SpringBoot Restful接口返回结果统一封装统一异常封装_第4张图片
  2. 需要处理异常的控制器继承该类
    Springmv SpringBoot Restful接口返回结果统一封装统一异常封装_第5张图片
    然后,假如前端未传入状态status,前端收到的响应字符串如下:
{
“errorMsg “: “禁止操作”
“errorCode” : 403
}

你可能感兴趣的:(springboot,springmvc,统一异常处理,统一结果封装,java8)