SPRING统一Response返回

参考博文:
https://codecoord.blog.csdn.net/article/details/109032687

目前返回结果:


image.png

统一返回结果:


image.png

1.定义基本返回的Result类:

public class BaseResult<T> {
    private Integer code;
    private String message;
    private T data;
    private static final Integer SUCCESS_CODE = 0;
    private static final Integer FAIL_CODE = 1;

    public BaseResult() {
    }

    public BaseResult(Integer errCode, String message, T data) {
        this.code = errCode;
        this.message = message;
        this.data = data;
    }

    public static BaseResult<Object> success() {
        return new BaseResult(SUCCESS_CODE, (String) null, (Object) null);
    }

    public static BaseResult<Object> success(String message, Object data) {
        return new BaseResult(SUCCESS_CODE, message, data);
    }

    public static BaseResult<Object> success(Integer errCode, String message, Object data) {
        return new BaseResult(errCode, message, data);
    }

    public static BaseResult<Object> success(Object data) {
        return new BaseResult(SUCCESS_CODE, (String) null, data);
    }

    public static BaseResult<Object> fail(String message) {
        return new BaseResult(FAIL_CODE, message, null);
    }

    public static BaseResult<Object> fail(String message, Object data) {
        return new BaseResult(FAIL_CODE, message, data);
    }

    public static BaseResult<Object> fail(Integer failCode, String message, Object data) {
        return new BaseResult(failCode, message, data);
    }

    public static BaseResult<Object> fail(Object data) {
        return new BaseResult(FAIL_CODE, (String) null, data);
    }

    public Integer getCode() {
        return this.code;
    }

    public String getMessage() {
        return this.message;
    }

    public T getData() {
        return this.data;
    }

    public void setErrCode(Integer code) {
        this.code = code;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public void setData(T data) {
        this.data = data;
    }
}

2.定义处理类

将返回结果替换

public class ResponseBodyWrapHandler implements HandlerMethodReturnValueHandler {
    private final HandlerMethodReturnValueHandler delegate;

    public ResponseBodyWrapHandler(HandlerMethodReturnValueHandler delegate) {
        this.delegate = delegate;
    }

    @Override
    public boolean supportsReturnType(MethodParameter methodParameter) {
        return delegate.supportsReturnType(methodParameter);
    }

    @Override
    public void handleReturnValue(Object returnValue,
                                  MethodParameter methodParameter,
                                  ModelAndViewContainer modelAndViewContainer,
                                  NativeWebRequest nativeWebRequest) throws Exception {
        
        if(!(returnValue instanceof BaseResult)){
            returnValue = BaseResult.success(returnValue);
        }
        delegate.handleReturnValue(returnValue,methodParameter,modelAndViewContainer,nativeWebRequest);
    }
}

3.替换原有的处理类

@Component
public class ResponseBodyWrapFactoryBean implements InitializingBean {

    private final RequestMappingHandlerAdapter requestMappingHandlerAdapter;

    @Autowired
    public ResponseBodyWrapFactoryBean(RequestMappingHandlerAdapter requestMappingHandlerAdapter) {
        this.requestMappingHandlerAdapter = requestMappingHandlerAdapter;
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        List<HandlerMethodReturnValueHandler> returnValueHandlers = requestMappingHandlerAdapter.getReturnValueHandlers();
        ArrayList<HandlerMethodReturnValueHandler> handlers = new ArrayList<>(returnValueHandlers);
        if(handlers.size() > 0){
            decorateHandlers(handlers);
        }
        requestMappingHandlerAdapter.setReturnValueHandlers(handlers);

    }

    private void decorateHandlers(List<HandlerMethodReturnValueHandler> handlers){
        Iterator<HandlerMethodReturnValueHandler> iterator = handlers.iterator();
        while (iterator.hasNext()){
            HandlerMethodReturnValueHandler currentHandler = iterator.next();
            if(currentHandler instanceof RequestResponseBodyMethodProcessor){
                ResponseBodyWrapHandler wrapHandler = new ResponseBodyWrapHandler(currentHandler);
                int index = handlers.indexOf(currentHandler);
                handlers.set(index,wrapHandler);
                break;
            }
        }
    }
}

定义注释,跳过统一封装

4.注释类

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface IgnoreResponseWarpper {
}

5.在处理时跳过注释标记过的方法或类

@Override
    public void handleReturnValue(Object returnValue,
                                  MethodParameter methodParameter,
                                  ModelAndViewContainer modelAndViewContainer,
                                  NativeWebRequest nativeWebRequest) throws Exception {
        IgnoreResponseWarpper ignoreAnnotation = methodParameter.getDeclaringClass().getAnnotation(IgnoreResponseWarpper.class);
        if(ignoreAnnotation != null){
            delegate.handleReturnValue(returnValue,methodParameter,modelAndViewContainer,nativeWebRequest);
            return;
        }
        ignoreAnnotation = methodParameter.getMethodAnnotation(IgnoreResponseWarpper.class);
        if(ignoreAnnotation != null){
            delegate.handleReturnValue(returnValue,methodParameter,modelAndViewContainer,nativeWebRequest);
            return;
        }
        if(!(returnValue instanceof BaseResult)){
            returnValue = BaseResult.success(returnValue);
        }
        delegate.handleReturnValue(returnValue,methodParameter,modelAndViewContainer,nativeWebRequest);
    }
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 用两张图告诉你,为什么你的 App 会卡顿? - Android - 掘金 Cover 有什么料? 从这篇文章中你...
    hw1212阅读 14,466评论 2 59
  • 〇、前言 本文共108张图,流量党请慎重! 历时1个半月,我把自己学习Python基础知识的框架详细梳理了一遍。 ...
    Raxxie阅读 19,202评论 17 410
  • 下划线和self.的区别 1.通过self. 访问,包含了set和get方法。通过下划线是获取自己的实例变量,不包...
    A_rcher34阅读 4,332评论 0 3
  • 站在前辈的肩膀上前行 UIKit框架和Foundation框架 所有的Mac OS X和IOS程序都是由大量的对象...
    zysmoon阅读 12,800评论 0 16
  • 久违的晴天,家长会。 家长大会开好到教室时,离放学已经没多少时间了。班主任说已经安排了三个家长分享经验。 放学铃声...
    飘雪儿5阅读 12,186评论 16 22