您觉得本文档还缺少什么内容?可以自己补充~
本系统定义了全局统一返回对象 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 {
}