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.io.InputStream;
20 import java.io.Reader;
21 import java.security.Principal;
22 import java.time.ZoneId;
23 import java.util.Locale;
24 import java.util.TimeZone;
25 import javax.servlet.ServletRequest;
26 import javax.servlet.http.HttpServletRequest;
27 import javax.servlet.http.HttpSession;
28
29 import org.springframework.core.MethodParameter;
30 import org.springframework.http.HttpMethod;
31 import org.springframework.lang.UsesJava8;
32 import org.springframework.web.bind.support.WebDataBinderFactory;
33 import org.springframework.web.context.request.NativeWebRequest;
34 import org.springframework.web.context.request.ServletWebRequest;
35 import org.springframework.web.context.request.WebRequest;
36 import org.springframework.web.method.support.HandlerMethodArgumentResolver;
37 import org.springframework.web.method.support.ModelAndViewContainer;
38 import org.springframework.web.multipart.MultipartRequest;
39 import org.springframework.web.servlet.support.RequestContextUtils;
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62 public class ServletRequestMethodArgumentResolver implements HandlerMethodArgumentResolver {
63
64 @Override
65 public boolean supportsParameter(MethodParameter parameter) {
66 Class<?> paramType = parameter.getParameterType();
67 return (WebRequest.class.isAssignableFrom(paramType) ||
68 ServletRequest.class.isAssignableFrom(paramType) ||
69 MultipartRequest.class.isAssignableFrom(paramType) ||
70 HttpSession.class.isAssignableFrom(paramType) ||
71 Principal.class.isAssignableFrom(paramType) ||
72 Locale.class.equals(paramType) ||
73 TimeZone.class.equals(paramType) ||
74 "java.time.ZoneId".equals(paramType.getName()) ||
75 InputStream.class.isAssignableFrom(paramType) ||
76 Reader.class.isAssignableFrom(paramType) ||
77 HttpMethod.class.equals(paramType));
78 }
79
80 @Override
81 public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer,
82 NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
83
84 Class<?> paramType = parameter.getParameterType();
85 if (WebRequest.class.isAssignableFrom(paramType)) {
86 return webRequest;
87 }
88
89 HttpServletRequest request = webRequest.getNativeRequest(HttpServletRequest.class);
90 if (ServletRequest.class.isAssignableFrom(paramType) || MultipartRequest.class.isAssignableFrom(paramType)) {
91 Object nativeRequest = webRequest.getNativeRequest(paramType);
92 if (nativeRequest == null) {
93 throw new IllegalStateException(
94 "Current request is not of type [" + paramType.getName() + "]: " + request);
95 }
96 return nativeRequest;
97 }
98 else if (HttpSession.class.isAssignableFrom(paramType)) {
99 return request.getSession();
100 }
101 else if (HttpMethod.class.equals(paramType)) {
102 return ((ServletWebRequest) webRequest).getHttpMethod();
103 }
104 else if (Principal.class.isAssignableFrom(paramType)) {
105 return request.getUserPrincipal();
106 }
107 else if (Locale.class.equals(paramType)) {
108 return RequestContextUtils.getLocale(request);
109 }
110 else if (TimeZone.class.equals(paramType)) {
111 TimeZone timeZone = RequestContextUtils.getTimeZone(request);
112 return (timeZone != null ? timeZone : TimeZone.getDefault());
113 }
114 else if ("java.time.ZoneId".equals(paramType.getName())) {
115 return ZoneIdResolver.resolveZoneId(request);
116 }
117 else if (InputStream.class.isAssignableFrom(paramType)) {
118 return request.getInputStream();
119 }
120 else if (Reader.class.isAssignableFrom(paramType)) {
121 return request.getReader();
122 }
123 else {
124
125 throw new UnsupportedOperationException(
126 "Unknown parameter type: " + paramType + " in method: " + parameter.getMethod());
127 }
128 }
129
130
131
132
133
134 @UsesJava8
135 private static class ZoneIdResolver {
136
137 public static Object resolveZoneId(HttpServletRequest request) {
138 TimeZone timeZone = RequestContextUtils.getTimeZone(request);
139 return (timeZone != null ? timeZone.toZoneId() : ZoneId.systemDefault());
140 }
141 }
142
143 }