SPRING统一Response返回

2021-02-01  本文已影响0人  ccccaixiaohao

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

猜你喜欢

热点阅读