您觉得本文档还缺少什么内容?可以自己补充~

本系统定义了全局统一返回对象 R,返回给前端的格式为:

{
    "code": 0, // 状态码  0表示成功
    "msg": "", // 错误消息
    "path": "", // 请求的地址
    "timestamp": 0,  // 请求时的时间戳
    "data": {}, // 返回的业务数据
    "extra": {},  // 返回的扩展数据
    "errorMsg": "" // 返回的异常消息
}

我们可以在控制类的方法返回值上显示的使用 R 来包装返回值,也可以使用 AbstractGlobalResponseBodyAdvice 提供的全局包装器来优雅返回。

  • 自己使用R来返回
@GetMapping("/check")
public R<Boolean> check(@RequestParam(required = false) Long id, @RequestParam String name) {
    return success(baseService.check(id, name));
}

// 返回值为
{
    "code": 0, // 状态码  0表示成功
    "msg": "", // 错误消息
    "path": "", // 请求的地址
    "timestamp": 0,  // 请求时的时间戳
    "data": true, 
    "extra": {},  // 返回的扩展数据
}
  • 使用全局包装器返回
// 控制类的方法,返回Boolean类型,也会统一包装成R的格式
@GetMapping("/check")
public Boolean check(@RequestParam(required = false) Long id, @RequestParam String name) {
    return baseService.check(id, name);
}

// 返回值为:
{
    "code": 0, // 状态码  0表示成功
    "msg": "", // 错误消息
    "path": "", // 请求的地址
    "timestamp": 0,  // 请求时的时间戳
    "data": true, 
    "extra": {},  // 返回的扩展数据
}
  • 全局响应体包装, 实现原理:
public class AbstractGlobalResponseBodyAdvice implements ResponseBodyAdvice {
    @Override
    public boolean supports(MethodParameter methodParameter, Class aClass) {
        // 类上如果被 IgnoreResponseBodyAdvice 标识就不拦截
        if (methodParameter.getDeclaringClass().isAnnotationPresent(IgnoreResponseBodyAdvice.class)) {
            return false;
        }

        // 方法上被标注也不拦截
        if (methodParameter.getMethod().isAnnotationPresent(IgnoreResponseBodyAdvice.class)) {
            return false;
        }
        return true;
    }

    @Override
    public Object beforeBodyWrite(Object o, MethodParameter methodParameter, MediaType mediaType, Class aClass, ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse) {
        if (o == null) {
            return null;
        }
        if (o instanceof R) {
            return o;
        }

        return R.success(o);
    }
}
  • 在需要此功能的服务,继承 AbstractGlobalResponseBodyAdvice:
@Configuration
@ConditionalOnClass({Servlet.class, DispatcherServlet.class})
@ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.SERVLET)
@RestControllerAdvice(basePackages = {"com.becypress.product"})
public class ResponseConfiguration extends AbstractGlobalResponseBodyAdvice {
}

results matching ""

    No results matching ""