一、统一返回对象(第一种方式)
第一种写法
@Getter
@Setter
public class Results {
// 返回状态标识
private Integer code;
// 返回数据
private Object data;
// 返回成功或失败的消息
private String msg;
// 成功返回数据
public static Results success(Object data){
Results results = new Results();
results.setCode(200);
results.setData(data);
results.setMsg("");
return results;
}
// 成功返回数据,返回消息
public static Results success(Object data,String msg){
Results results = new Results();
results.setCode(200);
results.setData(data);
results.setMsg(msg);
return results;
}
// 失败只返回消息
public static Results fail(String msg){
Results results = new Results();
results.setCode(201);
results.setData(null);
results.setMsg(msg);
return results;
}
}
第二种写法
@Getter
@Setter
@AllArgsConstructor
public class Results {
// 返回状态标识
private Integer code;
// 返回数据
private Object data;
// 返回成功或失败的消息
private String msg;
// 成功返回:数据
public static Results success(Object data) {
return success(200, data, "");
}
// 成功返回:数据、消息
public static Results success(Object data, String msg) {
return success(200, data, msg);
}
// 成功返回:自定义状态码、数据、消息
public static Results success(Integer code, Object data, String msg) {
return new Results(code, data, msg);
}
// 失败只返回:消息
public static Results fail(String msg) {
return fail(-1, null, msg);
}
// 失败返回:数据、消息
public static Results fail(Object data, String msg) {
return fail(-1, data, msg);
}
// 失败返回:自定义状态码、数据、消息
public static Results fail(Integer code, Object data, String msg) {
return new Results(code, data, msg);
}
}
二、统一返回对象(第二种方式)
使用枚举来管理状态
// 定义状态统一字典管理
@Getter
public enum RHttpStateEnum {
ORDER_CREATE_SUCCESS(200, "订单创建成功"),
ORDER_CREATE_FAIL(201, "订单创建失败");
private final int code;
private final String msg;
RHttpStateEnum(int code, String msg) {
this.code = code;
this.msg = msg;
}
// 不生成set方法,因为ORDER_CREATE_SUCCESS已经把code,msg赋值了;没有必要去修改code、msg的值。
}
// 定义统一返回对象
@Getter
@Setter
@AllArgsConstructor
public class Results {
// 返回状态标识
private Integer code;
// 返回数据
private Object data;
// 返回成功或失败的消息
private String msg;
// 成功返回数据
public static Results success(Object data){
return new Results(RHttpStateEnum.ORDER_CREATE_SUCCESS.getCode(), data,RHttpStateEnum.ORDER_CREATE_SUCCESS.getMsg());
}
// 成功返回数据,返回消息
public static Results success(Object data,String msg){
return new Results(RHttpStateEnum.ORDER_CREATE_SUCCESS.getCode(),data,msg);
}
// 失败只返回消息
public static Results fail(RHttpStateEnum rHttpStateEnum){
return new Results(rHttpStateEnum.getCode(), null,rHttpStateEnum.getMsg());
}
}
// 调用失败返回消息
public static void main(String[] args) {
Results.fail(RHttpStateEnum.ORDER_CREATE_FAIL);
}
三、拦截返回值统一处理(第三种方式)
拦截Controller方法的返回值,统一处理返回值到响应体中(ResponseBodyAdvice接口)
import com.bg.passcheckweb.utils.JacksonUtils;
import org.springframework.core.MethodParameter;
import org.springframework.http.MediaType;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;
@ControllerAdvice("com.sywl.web.controller")// 配置扫描包
public class ResultsHandler implements ResponseBodyAdvice {
// 是否支持advice功能,true支持
@Override
public boolean supports(MethodParameter methodParameter, Class aClass) {
return true;
}
@Override
public Object beforeBodyWrite(Object o, MethodParameter methodParameter, MediaType mediaType, Class aClass,
ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse) {
//因为返回string类型会调用string的默认处理器直接返回,不会进行Results返回,所以要进行处理(转换成字符串)
if (o instanceof String){
return JacksonUtils.writeObjectAsString(Results.success(o));
}
return Results.success(o);
}
}
返回失败,则直接抛出自定义异常,再配置一个统一异常拦截
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
// 统一异常拦截
@Slf4j
@ControllerAdvice
public class GlobalExceptionHandler {
/**
*
* @param e 异常参数
* @return 返回给前端的异常信息
*/
@ExceptionHandler(Exception.class)
@ResponseBody
public String error(Exception e) {
e.printStackTrace();
log.error(String.format("统一异常拦截:%s", e.getMessage()));
return String.format("统一异常拦截:%s", e.getMessage());
}
}