一个标准的返回格式至少包含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
- @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
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
- @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);
- }
- }