1
1
/*
2
- * Copyright 2002-2016 the original author or authors.
2
+ * Copyright 2002-2017 the original author or authors.
3
3
*
4
4
* Licensed under the Apache License, Version 2.0 (the "License");
5
5
* you may not use this file except in compliance with the License.
30
30
import org .springframework .http .HttpMethod ;
31
31
import org .springframework .web .bind .support .WebDataBinderFactory ;
32
32
import org .springframework .web .context .request .NativeWebRequest ;
33
- import org .springframework .web .context .request .ServletWebRequest ;
34
33
import org .springframework .web .context .request .WebRequest ;
35
34
import org .springframework .web .method .support .HandlerMethodArgumentResolver ;
36
35
import org .springframework .web .method .support .ModelAndViewContainer ;
45
44
* <li>{@link MultipartRequest}
46
45
* <li>{@link HttpSession}
47
46
* <li>{@link Principal}
47
+ * <li>{@link InputStream}
48
+ * <li>{@link Reader}
49
+ * <li>{@link HttpMethod} (as of Spring 4.0)</li>
48
50
* <li>{@link Locale}
49
51
* <li>{@link TimeZone} (as of Spring 4.0)
50
52
* <li>{@link java.time.ZoneId} (as of Spring 4.0 and Java 8)</li>
51
- * <li>{@link InputStream}
52
- * <li>{@link Reader}
53
- * <li>{@link org.springframework.http.HttpMethod} (as of Spring 4.0)</li>
54
53
* </ul>
55
54
*
56
55
* @author Arjen Poutsma
@@ -68,12 +67,12 @@ public boolean supportsParameter(MethodParameter parameter) {
68
67
MultipartRequest .class .isAssignableFrom (paramType ) ||
69
68
HttpSession .class .isAssignableFrom (paramType ) ||
70
69
Principal .class .isAssignableFrom (paramType ) ||
71
- Locale .class == paramType ||
72
- TimeZone .class == paramType ||
73
- ZoneId .class == paramType ||
74
70
InputStream .class .isAssignableFrom (paramType ) ||
75
71
Reader .class .isAssignableFrom (paramType ) ||
76
- HttpMethod .class == paramType );
72
+ HttpMethod .class == paramType ||
73
+ Locale .class == paramType ||
74
+ TimeZone .class == paramType ||
75
+ ZoneId .class == paramType );
77
76
}
78
77
79
78
@ Override
@@ -82,6 +81,10 @@ public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer m
82
81
83
82
Class <?> paramType = parameter .getParameterType ();
84
83
if (WebRequest .class .isAssignableFrom (paramType )) {
84
+ if (!paramType .isInstance (webRequest )) {
85
+ throw new IllegalStateException (
86
+ "Current request is not of type [" + paramType .getName () + "]: " + webRequest );
87
+ }
85
88
return webRequest ;
86
89
}
87
90
@@ -95,13 +98,39 @@ public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer m
95
98
return nativeRequest ;
96
99
}
97
100
else if (HttpSession .class .isAssignableFrom (paramType )) {
98
- return request .getSession ();
101
+ HttpSession session = request .getSession ();
102
+ if (!paramType .isInstance (session )) {
103
+ throw new IllegalStateException (
104
+ "Current session is not of type [" + paramType .getName () + "]: " + session );
105
+ }
106
+ return session ;
99
107
}
100
- else if (HttpMethod .class == paramType ) {
101
- return ((ServletWebRequest ) webRequest ).getHttpMethod ();
108
+ else if (InputStream .class .isAssignableFrom (paramType )) {
109
+ InputStream inputStream = request .getInputStream ();
110
+ if (!paramType .isInstance (inputStream )) {
111
+ throw new IllegalStateException (
112
+ "Request input stream is not of type [" + paramType .getName () + "]: " + inputStream );
113
+ }
114
+ return inputStream ;
115
+ }
116
+ else if (Reader .class .isAssignableFrom (paramType )) {
117
+ Reader reader = request .getReader ();
118
+ if (!paramType .isInstance (reader )) {
119
+ throw new IllegalStateException (
120
+ "Request body reader is not of type [" + paramType .getName () + "]: " + reader );
121
+ }
122
+ return reader ;
102
123
}
103
124
else if (Principal .class .isAssignableFrom (paramType )) {
104
- return request .getUserPrincipal ();
125
+ Principal userPrincipal = request .getUserPrincipal ();
126
+ if (!paramType .isInstance (userPrincipal )) {
127
+ throw new IllegalStateException (
128
+ "Current user principal is not of type [" + paramType .getName () + "]: " + userPrincipal );
129
+ }
130
+ return userPrincipal ;
131
+ }
132
+ else if (HttpMethod .class == paramType ) {
133
+ return HttpMethod .resolve (request .getMethod ());
105
134
}
106
135
else if (Locale .class == paramType ) {
107
136
return RequestContextUtils .getLocale (request );
@@ -114,16 +143,10 @@ else if (ZoneId.class == paramType) {
114
143
TimeZone timeZone = RequestContextUtils .getTimeZone (request );
115
144
return (timeZone != null ? timeZone .toZoneId () : ZoneId .systemDefault ());
116
145
}
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
146
else {
124
- // should never happen...
147
+ // Should never happen...
125
148
throw new UnsupportedOperationException (
126
- "Unknown parameter type: " + paramType + " in method: " + parameter .getMethod ());
149
+ "Unknown parameter type [ " + paramType . getName () + "] in " + parameter .getMethod ());
127
150
}
128
151
}
129
152
0 commit comments