统一数据返回格式的实现

统一数据返回格式的实现

@ControllerAdvice +继承 ResponseBodyAdvice

@ControllerAdvice
public class ResponseAdvice implements ResponseBodyAdvice {
    /**
     * 内容是否需要重写(通过此方法可以选择性部分控制器和方法进行重写)
     * 返回 true 表示重写
     */
    @Override
    public boolean supports(MethodParameter returnType, Class converterType) {
        return false;
    }
​
    //方法返回之前调用此方法
    @Override
    public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {
        // 构造统一返回对象
        HashMap<String, Object> result = new HashMap<>();
        result.put("success", 1);
        result.put("message", "");
        result.put("data", body);
        return result;
    }
}

存在的问题:controller请求映射方法,返回值如果是null,不会执行统- -响应封装

解决办法

HandlerMethodReturnValueHandler
public class RequestResponseBodyMethodProcessorWrapper implements HandlerMethodReturnValueHandler {
​
    private final HandlerMethodReturnValueHandler delegate;
​
    public RequestResponseBodyMethodProcessorWrapper(HandlerMethodReturnValueHandler delegate) {
        this.delegate = delegate;
    }
​
    @Override
    public boolean supportsReturnType(MethodParameter returnType) {
        return delegate.supportsReturnType(returnType);
    }
​
    @Override
    public void handleReturnValue(Object returnValue, MethodParameter returnType, ModelAndViewContainer mavContainer, NativeWebRequest webRequest) throws Exception {
        //returnValue是Controller请求方法执行完,返回值
        if(!(returnValue instanceof ResponseResult)){//返回值本身就是需要的类型,不进行处理
            ResponseResult json = new ResponseResult();
            json.setSuccess(true);
            json.setData(returnValue);
            if(returnValue instanceof Page){
                Page page = (Page) json.getData();
                json.setTotal(page.getTotal());
            }
            returnValue = json;
        }
        delegate.handleReturnValue(returnValue, returnType, mavContainer, webRequest);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值