1、定义返回标准格式
一个标准的返回格式至少包含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<T> 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 <T> ResultData<T> success(){ return new ResultData(SUCCESS_CODE,SUCCESS_MSG,null); } public static <T> ResultData<T> success(String msg,T t){ return new ResultData(SUCCESS_CODE,msg,t); } public static <T> ResultData<T> success(T t){ return new ResultData(SUCCESS_CODE,SUCCESS_MSG,t); } public static <T> ResultData<T> fail(){ return new ResultData(FAILURE_CODE,FAILURE_MSG,null); } public static <T> ResultData<T> fail(T t){ return new ResultData(FAILURE_CODE,FAILURE_MSG,t); } public static <T> ResultData<T> fail(String msg,T t){ return new ResultData(FAILURE_CODE,msg,t); } public static <T> ResultData<T> fail(Integer code,String msg,T t){ return new ResultData<T>(code,msg,t); } public static <T> ResultData<T> fail(String msg){ return new ResultData(FAILURE_CODE,msg,null); } public static <T> ResultData<T> error(){ return new ResultData<>(ERROR_CODE,ERROR_MSG,null); } public static <T> ResultData<T> error(String msg){ return new ResultData<>(ERROR_CODE,msg,null); } public static <T> ResultData<T> dealing(){ return new ResultData<>(DEALING,DEALING_MSG,null); } public static <T> ResultData<T> dealing(String msg){ return new ResultData<>(DEALING,msg,null); } public static <T> ResultData<T> dealing(String msg,T t){ return new ResultData<>(DEALING,msg,t); } public static <T> ResultData<T> 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<T> {
/**
* 是否支持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<Object> {
@Autowired
private ObjectMapper objectMapper;
@Override
public boolean supports(MethodParameter methodParameter, Class<? extends HttpMessageConverter<?>> aClass) {
return true;
}
@SneakyThrows
@Override
public Object beforeBodyWrite(Object o, MethodParameter methodParameter, MediaType mediaType, Class<? extends HttpMessageConverter<?>> aClass, ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse) {
//Controller直接返回String的话,SpringBoot是直接返回,故我们需要手动转换成json
if(o instanceof String){
return objectMapper.writeValueAsString(ResultData.success(o));
}
if(o instanceof ResultData){
return o;
}
return ResultData.success(o);
}
}
3、针对异常的处理
上边进行的封装,如果遇到异常返回时,仍然会正常返回返回的也是成功的状态,所以需要针对异常进行全局异常统一处理。
@Slf4j
@RestControllerAdvice
public class RestExceptionHandler {
/**
* 默认全局异常处理。
* @param e the e
* @return ResultData
*/
@ExceptionHandler(Exception.class)
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
public ResultData<String> 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<Object> {
@Autowired
private ObjectMapper objectMapper;
@Override
public boolean supports(MethodParameter methodParameter, Class<? extends HttpMessageConverter<?>> aClass) {
return true;
}
@SneakyThrows
@Override
public Object beforeBodyWrite(Object o, MethodParameter methodParameter, MediaType mediaType, Class<? extends HttpMessageConverter<?>> aClass, ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse) {
//Controller直接返回String的话,SpringBoot是直接返回,故我们需要手动转换成json
if(o instanceof String){
return objectMapper.writeValueAsString(ResultData.success(o));
}
//如果返回的结果是ResultData对象,直接返回即可
if(o instanceof ResultData){
return o;
}
return ResultData.success(o);
}
}