SpringBoot Controller 返回值包裝

@Component
public class ResponseBodyWrapFactoryBean implements InitializingBean {

    @Resource
    private RequestMappingHandlerAdapter adapter;

    @Override
    public void afterPropertiesSet() {
        List<HandlerMethodReturnValueHandler> returnValueHandlers = adapter.getReturnValueHandlers();
        if (returnValueHandlers == null) {
            returnValueHandlers = new ArrayList<>(0);
        }

        List<HandlerMethodReturnValueHandler> handlers = new ArrayList<>(returnValueHandlers);
        decorateHandlers(handlers);
        adapter.setReturnValueHandlers(handlers);
    }


    private void decorateHandlers(List<HandlerMethodReturnValueHandler> handlers) {
        for (HandlerMethodReturnValueHandler handler : handlers) {
            if (handler instanceof RequestResponseBodyMethodProcessor) {
                handlers.set(handlers.indexOf(handler), new ResponseBodyWrapHandler(handler));
                break;
            }
        }
    }

    private static class ResponseBodyWrapHandler implements HandlerMethodReturnValueHandler {
        private final HandlerMethodReturnValueHandler delegate;

        ResponseBodyWrapHandler(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 {
            if (returnValue instanceof BaseResult) {
                delegate.handleReturnValue(returnValue, returnType, mavContainer, webRequest);
                return;
            }

            delegate.handleReturnValue(Result.success(returnValue), returnType, mavContainer, webRequest);
        }
    }
}

BaseResult 和 Result 是分別是要返回的接口類型及其實現類

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章