Skip to content

Commit fc11321

Browse files
committed
ServletRequestMethodArgumentResolver passes null references through (again)
Issue: SPR-15214
1 parent b3ad422 commit fc11321

File tree

2 files changed

+15
-6
lines changed

2 files changed

+15
-6
lines changed

spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/ServletRequestMethodArgumentResolver.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -121,39 +121,39 @@ private <T> T resolveNativeRequest(NativeWebRequest webRequest, Class<T> require
121121
private Object resolveArgument(Class<?> paramType, HttpServletRequest request) throws IOException {
122122
if (HttpSession.class.isAssignableFrom(paramType)) {
123123
HttpSession session = request.getSession();
124-
if (!paramType.isInstance(session)) {
124+
if (session != null && !paramType.isInstance(session)) {
125125
throw new IllegalStateException(
126126
"Current session is not of type [" + paramType.getName() + "]: " + session);
127127
}
128128
return session;
129129
}
130130
else if (getPushBuilderMethod != null && getPushBuilderMethod.getReturnType().isAssignableFrom(paramType)) {
131131
Object pushBuilder = ReflectionUtils.invokeMethod(getPushBuilderMethod, request);
132-
if (!paramType.isInstance(pushBuilder)) {
132+
if (pushBuilder != null && !paramType.isInstance(pushBuilder)) {
133133
throw new IllegalStateException(
134134
"Current push builder is not of type [" + paramType.getName() + "]: " + pushBuilder);
135135
}
136136
return pushBuilder;
137137
}
138138
else if (InputStream.class.isAssignableFrom(paramType)) {
139139
InputStream inputStream = request.getInputStream();
140-
if (!paramType.isInstance(inputStream)) {
140+
if (inputStream != null && !paramType.isInstance(inputStream)) {
141141
throw new IllegalStateException(
142142
"Request input stream is not of type [" + paramType.getName() + "]: " + inputStream);
143143
}
144144
return inputStream;
145145
}
146146
else if (Reader.class.isAssignableFrom(paramType)) {
147147
Reader reader = request.getReader();
148-
if (!paramType.isInstance(reader)) {
148+
if (reader != null && !paramType.isInstance(reader)) {
149149
throw new IllegalStateException(
150150
"Request body reader is not of type [" + paramType.getName() + "]: " + reader);
151151
}
152152
return reader;
153153
}
154154
else if (Principal.class.isAssignableFrom(paramType)) {
155155
Principal userPrincipal = request.getUserPrincipal();
156-
if (!paramType.isInstance(userPrincipal)) {
156+
if (userPrincipal != null && !paramType.isInstance(userPrincipal)) {
157157
throw new IllegalStateException(
158158
"Current user principal is not of type [" + paramType.getName() + "]: " + userPrincipal);
159159
}

spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/ServletRequestMethodArgumentResolverTests.java

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ public class ServletRequestMethodArgumentResolverTests {
6262

6363

6464
@Before
65-
public void setUp() throws Exception {
65+
public void setup() throws Exception {
6666
method = getClass().getMethod("supportedParams", ServletRequest.class, MultipartRequest.class,
6767
HttpSession.class, Principal.class, Locale.class, InputStream.class, Reader.class,
6868
WebRequest.class, TimeZone.class, ZoneId.class, HttpMethod.class);
@@ -112,6 +112,15 @@ public String getName() {
112112
assertSame("Invalid result", principal, result);
113113
}
114114

115+
@Test
116+
public void principalAsNull() throws Exception {
117+
MethodParameter principalParameter = new MethodParameter(method, 3);
118+
assertTrue("Principal not supported", resolver.supportsParameter(principalParameter));
119+
120+
Object result = resolver.resolveArgument(principalParameter, null, webRequest, null);
121+
assertNull("Invalid result", result);
122+
}
123+
115124
@Test
116125
public void locale() throws Exception {
117126
Locale locale = Locale.ENGLISH;

0 commit comments

Comments
 (0)