一个标准的返回格式至少包含3部分:
status 状态值:由后端统一定义各种返回结果的状态码
message 描述:本次接口调用的结果描述
data 数据:本次返回的数据。
package com.online.analyze.comm.util;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class ResultData implements Serializable {
public static final Integer SUCCESS_CODE = 0;
public static final Integer FAILURE_CODE = -1;
public static final Integer ERROR_CODE = 9999;
public static final Integer DEALING = 2222;
public static final String DEALING_MSG = "处理中";
public static final String SUCCESS_MSG = "成功";
public static final String FAILURE_MSG = "失败";
public static final String ERROR_MSG = "系统异常";
private Integer code;
private String msg;
protected T data;
public static ResultData success(){
return new ResultData(SUCCESS_CODE,SUCCESS_MSG,null);
}
public static ResultData success(String msg,T t){
return new ResultData(SUCCESS_CODE,msg,t);
}
public static ResultData success(T t){
return new ResultData(SUCCESS_CODE,SUCCESS_MSG,t);
}
public static ResultData fail(){
return new ResultData(FAILURE_CODE,FAILURE_MSG,null);
}
public static ResultData fail(T t){
return new ResultData(FAILURE_CODE,FAILURE_MSG,t);
}
public static ResultData fail(String msg,T t){
return new ResultData(FAILURE_CODE,msg,t);
}
public static ResultData fail(Integer code,String msg,T t){
return new ResultData(code,msg,t);
}
public static ResultData fail(String msg){
return new ResultData(FAILURE_CODE,msg,null);
}
public static ResultData error(){
return new ResultData<>(ERROR_CODE,ERROR_MSG,null);
}
public static ResultData error(String msg){
return new ResultData<>(ERROR_CODE,msg,null);
}
public static ResultData dealing(){
return new ResultData<>(DEALING,DEALING_MSG,null);
}
public static ResultData dealing(String msg){
return new ResultData<>(DEALING,msg,null);
}
public static ResultData dealing(String msg,T t){
return new ResultData<>(DEALING,msg,t);
}
public static ResultData dealing(T t){
return new ResultData<>(DEALING,DEALING_MSG,t);
}
}
接口统一返回
return ResultData.success("msg",data);
2、借助SpringBoot提供的ResponseBodyAdvice,统一处理controller返回值,
不要每个接口都手工制定ResultData
返回值
“
ResponseBodyAdvice的作用:拦截Controller方法的返回值,统一处理返回值/响应体,一般用来统一返回格式,加解密,签名等等。
”
public interface ResponseBodyAdvice {
/**
* 是否支持advice功能
* true 支持,false 不支持
*/
boolean supports(MethodParameter var1, Class extends HttpMessageConverter>> var2);
/**
* 对返回的数据进行处理
*/
@Nullable
T beforeBodyWrite(@Nullable T var1, MethodParameter var2, MediaType var3, Class extends HttpMessageConverter>> var4, ServerHttpRequest var5, ServerHttpResponse var6);
}
//实现类处理
//@RestControllerAdvice是@RestController注解的增强,可以实现三个方面的功能:
//全局异常处理
//全局数据绑定
//全局数据预处理
@RestControllerAdvice
public class ResponseAdvice implements ResponseBodyAdvice
3、针对异常的处理
上边进行的封装,如果遇到异常返回时,仍然会正常返回返回的也是成功的状态,所以需要针对异常进行全局异常统一处理。
@Slf4j
@RestControllerAdvice
public class RestExceptionHandler {
/**
* 默认全局异常处理。
* @param e the e
* @return ResultData
*/
@ExceptionHandler(Exception.class)
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
public ResultData exception(Exception e) {
log.error("全局异常信息 ex={}", e.getMessage(), e);
return ResultData.fail(ReturnCode.RC500.getCode(),e.getMessage());
}
}
@RestControllerAdvice,RestController的增强类,可用于实现全局异常处理器
@ExceptionHandler,统一处理某一类异常,从而减少代码重复率和复杂度,比如要获取自定义异常可以@ExceptionHandler(BusinessException.class)
@ResponseStatus指定客户端收到的http状态码
//实现类处理
//@RestControllerAdvice是@RestController注解的增强,可以实现三个方面的功能:
//全局异常处理
//全局数据绑定
//全局数据预处理
@RestControllerAdvice
public class ResponseAdvice implements ResponseBodyAdvice