文章目录
1. 统一返回相同格式的内容
设定的统一的返回格式
public class R extends HashMap<String,Object> {
public static String RET_CODE = "code"; // 返回码
public static String RET_MESSAGE = "msg";//返回码对应的说明
public static String RET_DATA = "data"; // 返回的数据
public static R error() {
R r = new R();
r.put(RET_CODE,1);
r.put(RET_MESSAGE,"未知异常,请联系管理员");
return r;
}
/**
* 操作成功返回类
* @param message 返回的描述
* @param data 返回的数据
* @return
*/
public static R ok(String message,Object data) {
R r = new R();
r.put(RET_CODE,0);
r.put(RET_MESSAGE,message);
if(data!=null){
r.put(RET_DATA,data);
}
return r;
}
public static R okData(Object data) {
return ok("操作成功",data);
}
public static R okMessage(String message) {
return ok(message,null);
}
public R put(String key, Object value) {
super.put(key, value);
return this;
}
}
使用统一的方法返回值来统一格式
@RestController
@RequestMapping("/hello1")
public class Hello1Controller {
@GetMapping("/t1")
public R hello1() {
return R.okData("返回成功的处理内容");
}
@GetMapping("/t2")
public R hello2() {
Map<String, Object> retMap = new HashMap<>();
retMap.put("k1", "v1");
return R.okData(retMap);
}
}
测试代码(使用idea HttpClient)
### 1.1 统一方法返回值(返回字符串)
GET {{base_url}}/hello1/t1
### 1.2 统一方法返回值(返回对象)
GET {{base_url}}/hello1/t2
2. 优化
使用ResponseBodyAdvice统一处理返回值
@RestControllerAdvice(basePackages = {"com.github.zq84.demo.web"}) // 注意,这里需要添加扫描的包
public class WebResponseHandle implements ResponseBodyAdvice<Object> {
private static final Logger log = LoggerFactory.getLogger(WebResponseHandle.class);
@Override
public boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> aClass) {
// 如果接口返回的类型本身就是R那就没有必要进行额外的操作,返回false
return !returnType.getParameterType().equals(R.class);
}
private static ObjectMapper objectMapper = new ObjectMapper();
@Override
public Object beforeBodyWrite(Object objData, MethodParameter returnType, MediaType mediaType, Class<?
extends HttpMessageConverter<?>> aClass, ServerHttpRequest request, ServerHttpResponse response) {
// 返回类型为json,所以String类型不能直接封装,需要进行特殊处理
if (String.class.equals(returnType.getGenericParameterType())) {
// 如果返回String,那么肯定是retMessage
try {
return objectMapper.writeValueAsString(R.okData(objData));
} catch (JsonProcessingException e) {
e.printStackTrace();
}
}
/* 如果使用封装类R,那么说明,需要重写处理成功的提示 */
R r = R.okData(objData);
if (objData instanceof R) {
r = (R) objData;
}
// 将原本的数据包装在JsonOut中
return r;
}
}
优化后不再需要手工封装返回值
@RestController
@RequestMapping("/hello2")
public class Hello2Controller {
@GetMapping("/t1")
public String hello1() {
return "hello world";
}
@GetMapping("/t2")
public Map<String, Object> hello2() {
Map<String, Object> retMap = new HashMap<>();
retMap.put("k1", "v1");
return retMap;
}
}
优化前后返回内容无区别。
代码地址:https://gitee.com/johnny/learn-demo/tree/master/springboot-demo/boot01-04-common-return