1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.springframework.web.method.support;
18
19 import java.util.Collections;
20 import java.util.LinkedList;
21 import java.util.List;
22 import java.util.Map;
23 import java.util.concurrent.ConcurrentHashMap;
24
25 import org.apache.commons.logging.Log;
26 import org.apache.commons.logging.LogFactory;
27
28 import org.springframework.core.MethodParameter;
29 import org.springframework.util.Assert;
30 import org.springframework.web.bind.support.WebDataBinderFactory;
31 import org.springframework.web.context.request.NativeWebRequest;
32
33
34
35
36
37
38
39
40 public class HandlerMethodArgumentResolverComposite implements HandlerMethodArgumentResolver {
41
42 protected final Log logger = LogFactory.getLog(getClass());
43
44 private final List<HandlerMethodArgumentResolver> argumentResolvers =
45 new LinkedList<HandlerMethodArgumentResolver>();
46
47 private final Map<MethodParameter, HandlerMethodArgumentResolver> argumentResolverCache =
48 new ConcurrentHashMap<MethodParameter, HandlerMethodArgumentResolver>(256);
49
50
51
52
53
54 public List<HandlerMethodArgumentResolver> getResolvers() {
55 return Collections.unmodifiableList(this.argumentResolvers);
56 }
57
58
59
60
61
62 @Override
63 public boolean supportsParameter(MethodParameter parameter) {
64 return getArgumentResolver(parameter) != null;
65 }
66
67
68
69
70
71 @Override
72 public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer,
73 NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
74
75 HandlerMethodArgumentResolver resolver = getArgumentResolver(parameter);
76 Assert.notNull(resolver, "Unknown parameter type [" + parameter.getParameterType().getName() + "]");
77 return resolver.resolveArgument(parameter, mavContainer, webRequest, binderFactory);
78 }
79
80
81
82
83 private HandlerMethodArgumentResolver getArgumentResolver(MethodParameter parameter) {
84 HandlerMethodArgumentResolver result = this.argumentResolverCache.get(parameter);
85 if (result == null) {
86 for (HandlerMethodArgumentResolver methodArgumentResolver : this.argumentResolvers) {
87 if (logger.isTraceEnabled()) {
88 logger.trace("Testing if argument resolver [" + methodArgumentResolver + "] supports [" +
89 parameter.getGenericParameterType() + "]");
90 }
91 if (methodArgumentResolver.supportsParameter(parameter)) {
92 result = methodArgumentResolver;
93 this.argumentResolverCache.put(parameter, result);
94 break;
95 }
96 }
97 }
98 return result;
99 }
100
101
102
103
104 public HandlerMethodArgumentResolverComposite addResolver(HandlerMethodArgumentResolver resolver) {
105 this.argumentResolvers.add(resolver);
106 return this;
107 }
108
109
110
111
112 public HandlerMethodArgumentResolverComposite addResolvers(List<? extends HandlerMethodArgumentResolver> resolvers) {
113 if (resolvers != null) {
114 for (HandlerMethodArgumentResolver resolver : resolvers) {
115 this.argumentResolvers.add(resolver);
116 }
117 }
118 return this;
119 }
120
121 }