1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.springframework.web.servlet.mvc.method.annotation;
18
19 import org.springframework.core.MethodParameter;
20 import org.springframework.web.context.request.NativeWebRequest;
21 import org.springframework.web.context.request.async.DeferredResult;
22 import org.springframework.web.context.request.async.WebAsyncUtils;
23 import org.springframework.web.method.support.HandlerMethodReturnValueHandler;
24 import org.springframework.web.method.support.ModelAndViewContainer;
25
26
27
28
29
30
31
32 public class DeferredResultMethodReturnValueHandler implements HandlerMethodReturnValueHandler {
33
34 @Override
35 public boolean supportsReturnType(MethodParameter returnType) {
36 return DeferredResult.class.isAssignableFrom(returnType.getParameterType());
37 }
38
39 @Override
40 public void handleReturnValue(Object returnValue, MethodParameter returnType,
41 ModelAndViewContainer mavContainer, NativeWebRequest webRequest) throws Exception {
42
43 if (returnValue == null) {
44 mavContainer.setRequestHandled(true);
45 return;
46 }
47
48 DeferredResult<?> deferredResult = (DeferredResult<?>) returnValue;
49 WebAsyncUtils.getAsyncManager(webRequest).startDeferredResultProcessing(deferredResult, mavContainer);
50 }
51
52 }