@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 是分別是要返回的接口類型及其實現類