public class ObservableReturnValueHandler implements HandlerMethodReturnValueHandler { public boolean supportsReturnType(MethodParameter returnType) { Class parameterType = returnType.getParameterType(); return Observable.class.isAssignableFrom(parameterType); } public void handleReturnValue(Object returnValue, MethodParameter returnType, ModelAndViewContainer mavContainer, NativeWebRequest webRequest) throws Exception { if(returnValue == null) { mavContainer.setRequestHandled(true); return; } final DeferredResult<Object> deferredResult = new DeferredResult<Object>(); Observable observable = (Observable) returnValue; observable.subscribe(result -> deferredResult.setResult(result), errors -> deferredResult.setErrorResult(errors)); WebAsyncUtils.getAsyncManager(webRequest).startDeferredResultProcessing(deferredResult, mavContainer); } }