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.beans.factory.BeanFactory;
20 import org.springframework.core.MethodParameter;
21 import org.springframework.web.context.request.NativeWebRequest;
22 import org.springframework.web.context.request.async.WebAsyncTask;
23 import org.springframework.web.context.request.async.WebAsyncUtils;
24 import org.springframework.web.method.support.HandlerMethodReturnValueHandler;
25 import org.springframework.web.method.support.ModelAndViewContainer;
26
27
28
29
30
31
32
33 public class AsyncTaskMethodReturnValueHandler implements HandlerMethodReturnValueHandler {
34
35 private final BeanFactory beanFactory;
36
37
38 public AsyncTaskMethodReturnValueHandler(BeanFactory beanFactory) {
39 this.beanFactory = beanFactory;
40 }
41
42
43 @Override
44 public boolean supportsReturnType(MethodParameter returnType) {
45 return WebAsyncTask.class.isAssignableFrom(returnType.getParameterType());
46 }
47
48 @Override
49 public void handleReturnValue(Object returnValue, MethodParameter returnType,
50 ModelAndViewContainer mavContainer, NativeWebRequest webRequest) throws Exception {
51
52 if (returnValue == null) {
53 mavContainer.setRequestHandled(true);
54 return;
55 }
56
57 WebAsyncTask<?> webAsyncTask = (WebAsyncTask<?>) returnValue;
58 webAsyncTask.setBeanFactory(this.beanFactory);
59 WebAsyncUtils.getAsyncManager(webRequest).startCallableProcessing(webAsyncTask, mavContainer);
60 }
61
62 }