目录
SpringBoot实现ResponseBodyAdvice对controller返回值统一封装
为什么统一格式?
-
统一返回数据格式一般会包含状态码、返回消息、数据这几部分内容
-
方便前端人员方便解析数据和处理数据
-
前端会根据状态码的约定进行对应处理
创建统一返回值的VO类
public class R<T> {
/** 状态码 */
private Integer code;
/** 消息体 */
private String msg;
/** 数据 */
private T data;
public static <T> R<T> sucess(T data) {
R<T> r = new R<T>();
r.setCode(200);
r.setMsg("操作成功");
r.setData(data);
return r;
}
public static <T> R<T> error(String msg) {
R<T> r = new R<T>();
r.setCode(500);
r.setMsg(msg);
return r;
}
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
}
创建拦截返回值的增强类
ps:方法JSON.toJSONString()使用的是阿里的fastjson,底部有fastjson的依赖
@RestControllerAdvice
public class ResponseBodyConfig implements ResponseBodyAdvice<Object> {
@Override
public boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> aClass) {
if (returnType.getParameterType().equals(R.class)) {
// 返回类型已是正确的
return false;
}
return true;
}
@Override
public Object beforeBodyWrite(Object body, MethodParameter methodParameter, MediaType mediaType,
Class<? extends HttpMessageConverter<?>> aClass, ServerHttpRequest serverHttpRequest,
ServerHttpResponse serverHttpResponse) {
// String类型不能直接包装,需要转换JSON处理
if (body instanceof String) {
return JSON.toJSONString(R.sucess(body));
}
return R.sucess(body);
}
}
小栗子
String类型
@RequestMapping(value = "/testString", method = RequestMethod.POST)
public String testString() {
return "hello word";
}
结果:
List类型
@RequestMapping(value = "/testList", method = RequestMethod.POST)
public List<User> testList() {
List<User> userList = Lists.newArrayList();
User user = new User();
user.setUsername("一个肥鲶鱼");
user.setEmail("****@qq.com");
userList.add(user);
return userList;
}
结果:
搞定!!!
补充:
<!-- 阿里JSON解析器 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.78</version>
</dependency>