springboot统一封装返回值

springboot统一封装返回值

统一返回类 ResultVo

@Data
public class ResultVo {
          
   
    // 状态码
    private int code;

    // 状态信息
    private String msg;

    // 返回对象
    private Object data;

    // 手动设置返回vo
    public ResultVo(int code, String msg, Object data) {
          
   
        this.code = code;
        this.msg = msg;
        this.data = data;
    }
返回天天new ResultVo(data~~) 统一全局返回
@RestControllerAdvice(basePackages = {
          
   "com.xxxx"})
public class ControllerResponseAdvice implements ResponseBodyAdvice<Object> {
          
   
    @Override
    public boolean supports(MethodParameter methodParameter, Class<? extends HttpMessageConverter<?>> aClass) {
          
   
        // response是ResultVo类型,或者注释了NotControllerResponseAdvice都不进行包装
        return !methodParameter.getParameterType().isAssignableFrom(ResultVo.class);
    }

    @Override
    public Object beforeBodyWrite(Object data, MethodParameter returnType, MediaType mediaType, Class<? extends HttpMessageConverter<?>> aClass, ServerHttpRequest request, ServerHttpResponse response) {
          
   
        // String类型不能直接包装
        if (returnType.getGenericParameterType().equals(String.class)) {
          
   
            ObjectMapper objectMapper = new ObjectMapper();
            try {
          
   
                // 将数据包装在ResultVo里后转换为json串进行返回
                return objectMapper.writeValueAsString(new ResultVo(data));
            } catch (JsonProcessingException e) {
          
   
                throw new APIException(ResultCode.RESPONSE_PACK_ERROR, e.getMessage());
            }
        }
        // 否则直接包装成ResultVo返回
        return new ResultVo(data);
    }
}
新增不进行封装注解 人家要的返回只要一个字符串
@Target({
          
   ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface NotControllerResponseAdvice {
          
   
}
@RestControllerAdvice(basePackages = {
          
   "com.xxxx"})
public class ControllerResponseAdvice implements ResponseBodyAdvice<Object> {
          
   
    @Override
    public boolean supports(MethodParameter methodParameter, Class<? extends HttpMessageConverter<?>> aClass) {
          
   
        // response是ResultVo类型,或者注释了NotControllerResponseAdvice都不进行包装
        return !(methodParameter.getParameterType().isAssignableFrom(ResultVo.class)
                || methodParameter.hasMethodAnnotation(NotControllerResponseAdvice.class));
    }
    ...
经验分享 程序员 微信小程序 职场和发展