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 java.lang.reflect.Method;
20 import java.util.List;
21
22 import org.springframework.core.MethodParameter;
23 import org.springframework.ui.ExtendedModelMap;
24 import org.springframework.web.context.request.NativeWebRequest;
25 import org.springframework.web.method.annotation.ModelAttributeMethodProcessor;
26 import org.springframework.web.method.support.HandlerMethodReturnValueHandler;
27 import org.springframework.web.method.support.ModelAndViewContainer;
28 import org.springframework.web.servlet.ModelAndView;
29 import org.springframework.web.servlet.mvc.annotation.ModelAndViewResolver;
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54 public class ModelAndViewResolverMethodReturnValueHandler implements HandlerMethodReturnValueHandler {
55
56 private final List<ModelAndViewResolver> mavResolvers;
57
58 private final ModelAttributeMethodProcessor modelAttributeProcessor = new ModelAttributeMethodProcessor(true);
59
60
61
62
63
64 public ModelAndViewResolverMethodReturnValueHandler(List<ModelAndViewResolver> mavResolvers) {
65 this.mavResolvers = mavResolvers;
66 }
67
68
69
70
71
72 @Override
73 public boolean supportsReturnType(MethodParameter returnType) {
74 return true;
75 }
76
77 @Override
78 public void handleReturnValue(Object returnValue, MethodParameter returnType,
79 ModelAndViewContainer mavContainer, NativeWebRequest webRequest) throws Exception {
80
81 if (this.mavResolvers != null) {
82 for (ModelAndViewResolver mavResolver : this.mavResolvers) {
83 Class<?> handlerType = returnType.getContainingClass();
84 Method method = returnType.getMethod();
85 ExtendedModelMap model = (ExtendedModelMap) mavContainer.getModel();
86 ModelAndView mav = mavResolver.resolveModelAndView(method, handlerType, returnValue, model, webRequest);
87 if (mav != ModelAndViewResolver.UNRESOLVED) {
88 mavContainer.addAllAttributes(mav.getModel());
89 mavContainer.setViewName(mav.getViewName());
90 if (!mav.isReference()) {
91 mavContainer.setView(mav.getView());
92 }
93 return;
94 }
95 }
96 }
97
98
99 if (this.modelAttributeProcessor.supportsReturnType(returnType)) {
100 this.modelAttributeProcessor.handleReturnValue(returnValue, returnType, mavContainer, webRequest);
101 }
102 else {
103 throw new UnsupportedOperationException("Unexpected return type: " +
104 returnType.getParameterType().getName() + " in method: " + returnType.getMethod());
105 }
106 }
107
108 }