1
1
/*
2
- * Copyright 2002-2014 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.
31
31
import org .springframework .lang .UsesJava8 ;
32
32
import org .springframework .web .bind .support .WebDataBinderFactory ;
33
33
import org .springframework .web .context .request .NativeWebRequest ;
34
- import org .springframework .web .context .request .ServletWebRequest ;
35
34
import org .springframework .web .context .request .WebRequest ;
36
35
import org .springframework .web .method .support .HandlerMethodArgumentResolver ;
37
36
import org .springframework .web .method .support .ModelAndViewContainer ;
46
45
* <li>{@link MultipartRequest}
47
46
* <li>{@link HttpSession}
48
47
* <li>{@link Principal}
48
+ * <li>{@link InputStream}
49
+ * <li>{@link Reader}
50
+ * <li>{@link HttpMethod} (as of Spring 4.0)</li>
49
51
* <li>{@link Locale}
50
52
* <li>{@link TimeZone} (as of Spring 4.0)
51
53
* <li>{@link java.time.ZoneId} (as of Spring 4.0 and Java 8)</li>
52
- * <li>{@link InputStream}
53
- * <li>{@link Reader}
54
- * <li>{@link org.springframework.http.HttpMethod} (as of Spring 4.0)</li>
55
54
* </ul>
56
55
*
57
56
* @author Arjen Poutsma
@@ -69,12 +68,12 @@ public boolean supportsParameter(MethodParameter parameter) {
69
68
MultipartRequest .class .isAssignableFrom (paramType ) ||
70
69
HttpSession .class .isAssignableFrom (paramType ) ||
71
70
Principal .class .isAssignableFrom (paramType ) ||
72
- Locale .class == paramType ||
73
- TimeZone .class == paramType ||
74
- "java.time.ZoneId" .equals (paramType .getName ()) ||
75
71
InputStream .class .isAssignableFrom (paramType ) ||
76
72
Reader .class .isAssignableFrom (paramType ) ||
77
- HttpMethod .class == paramType );
73
+ HttpMethod .class == paramType ||
74
+ Locale .class == paramType ||
75
+ TimeZone .class == paramType ||
76
+ "java.time.ZoneId" .equals (paramType .getName ()));
78
77
}
79
78
80
79
@ Override
@@ -83,6 +82,10 @@ public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer m
83
82
84
83
Class <?> paramType = parameter .getParameterType ();
85
84
if (WebRequest .class .isAssignableFrom (paramType )) {
85
+ if (!paramType .isInstance (webRequest )) {
86
+ throw new IllegalStateException (
87
+ "Current request is not of type [" + paramType .getName () + "]: " + webRequest );
88
+ }
86
89
return webRequest ;
87
90
}
88
91
@@ -96,13 +99,39 @@ public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer m
96
99
return nativeRequest ;
97
100
}
98
101
else if (HttpSession .class .isAssignableFrom (paramType )) {
99
- return request .getSession ();
102
+ HttpSession session = request .getSession ();
103
+ if (!paramType .isInstance (session )) {
104
+ throw new IllegalStateException (
105
+ "Current session is not of type [" + paramType .getName () + "]: " + session );
106
+ }
107
+ return session ;
100
108
}
101
- else if (HttpMethod .class == paramType ) {
102
- return ((ServletWebRequest ) webRequest ).getHttpMethod ();
109
+ else if (InputStream .class .isAssignableFrom (paramType )) {
110
+ InputStream inputStream = request .getInputStream ();
111
+ if (!paramType .isInstance (inputStream )) {
112
+ throw new IllegalStateException (
113
+ "Request input stream is not of type [" + paramType .getName () + "]: " + inputStream );
114
+ }
115
+ return inputStream ;
116
+ }
117
+ else if (Reader .class .isAssignableFrom (paramType )) {
118
+ Reader reader = request .getReader ();
119
+ if (!paramType .isInstance (reader )) {
120
+ throw new IllegalStateException (
121
+ "Request body reader is not of type [" + paramType .getName () + "]: " + reader );
122
+ }
123
+ return reader ;
103
124
}
104
125
else if (Principal .class .isAssignableFrom (paramType )) {
105
- return request .getUserPrincipal ();
126
+ Principal userPrincipal = request .getUserPrincipal ();
127
+ if (!paramType .isInstance (userPrincipal )) {
128
+ throw new IllegalStateException (
129
+ "Current user principal is not of type [" + paramType .getName () + "]: " + userPrincipal );
130
+ }
131
+ return userPrincipal ;
132
+ }
133
+ else if (HttpMethod .class == paramType ) {
134
+ return HttpMethod .resolve (request .getMethod ());
106
135
}
107
136
else if (Locale .class == paramType ) {
108
137
return RequestContextUtils .getLocale (request );
@@ -114,16 +143,10 @@ else if (TimeZone.class == paramType) {
114
143
else if ("java.time.ZoneId" .equals (paramType .getName ())) {
115
144
return ZoneIdResolver .resolveZoneId (request );
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