美文网首页
SPRING统一Response返回

SPRING统一Response返回

作者: ccccaixiaohao | 来源:发表于2021-02-01 16:46 被阅读0次

    参考博文:
    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);
        }
    

    相关文章

      网友评论

          本文标题:SPRING统一Response返回

          本文链接:https://www.haomeiwen.com/subject/koxstltx.html