Skip to content

Commit f117b80

Browse files
committed
ServletRequestMethodArgumentResolver passes null references through (again)
Issue: SPR-15214 (cherry picked from commit fc11321)
1 parent 278199d commit f117b80

File tree

2 files changed

+23
-12
lines changed

2 files changed

+23
-12
lines changed

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -100,31 +100,31 @@ public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer m
100100
}
101101
else if (HttpSession.class.isAssignableFrom(paramType)) {
102102
HttpSession session = request.getSession();
103-
if (!paramType.isInstance(session)) {
103+
if (session != null && !paramType.isInstance(session)) {
104104
throw new IllegalStateException(
105105
"Current session is not of type [" + paramType.getName() + "]: " + session);
106106
}
107107
return session;
108108
}
109109
else if (InputStream.class.isAssignableFrom(paramType)) {
110110
InputStream inputStream = request.getInputStream();
111-
if (!paramType.isInstance(inputStream)) {
111+
if (inputStream != null && !paramType.isInstance(inputStream)) {
112112
throw new IllegalStateException(
113113
"Request input stream is not of type [" + paramType.getName() + "]: " + inputStream);
114114
}
115115
return inputStream;
116116
}
117117
else if (Reader.class.isAssignableFrom(paramType)) {
118118
Reader reader = request.getReader();
119-
if (!paramType.isInstance(reader)) {
119+
if (reader != null && !paramType.isInstance(reader)) {
120120
throw new IllegalStateException(
121121
"Request body reader is not of type [" + paramType.getName() + "]: " + reader);
122122
}
123123
return reader;
124124
}
125125
else if (Principal.class.isAssignableFrom(paramType)) {
126126
Principal userPrincipal = request.getUserPrincipal();
127-
if (!paramType.isInstance(userPrincipal)) {
127+
if (userPrincipal != null && !paramType.isInstance(userPrincipal)) {
128128
throw new IllegalStateException(
129129
"Current user principal is not of type [" + paramType.getName() + "]: " + userPrincipal);
130130
}

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

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -50,25 +50,27 @@
5050
*/
5151
public class ServletRequestMethodArgumentResolverTests {
5252

53-
private final ServletRequestMethodArgumentResolver resolver = new ServletRequestMethodArgumentResolver();
54-
55-
private Method method;
53+
private ServletRequestMethodArgumentResolver resolver;
5654

5755
private ModelAndViewContainer mavContainer;
5856

57+
private MockHttpServletRequest servletRequest;
58+
5959
private ServletWebRequest webRequest;
6060

61-
private MockHttpServletRequest servletRequest;
61+
private Method method;
6262

6363

6464
@Before
65-
public void setUp() throws Exception {
66-
method = getClass().getMethod("supportedParams", ServletRequest.class, MultipartRequest.class,
67-
HttpSession.class, Principal.class, Locale.class, InputStream.class, Reader.class,
68-
WebRequest.class, TimeZone.class, ZoneId.class, HttpMethod.class);
65+
public void setup() throws Exception {
66+
resolver = new ServletRequestMethodArgumentResolver();
6967
mavContainer = new ModelAndViewContainer();
7068
servletRequest = new MockHttpServletRequest("GET", "");
7169
webRequest = new ServletWebRequest(servletRequest, new MockHttpServletResponse());
70+
71+
method = getClass().getMethod("supportedParams", ServletRequest.class, MultipartRequest.class,
72+
HttpSession.class, Principal.class, Locale.class, InputStream.class, Reader.class,
73+
WebRequest.class, TimeZone.class, ZoneId.class, HttpMethod.class);
7274
}
7375

7476

@@ -112,6 +114,15 @@ public String getName() {
112114
assertSame("Invalid result", principal, result);
113115
}
114116

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

0 commit comments

Comments
 (0)