1
1
/*
2
- * Copyright 2002-2021 the original author or authors.
2
+ * Copyright 2002-2022 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.
16
16
17
17
package org .springframework .web .servlet .mvc .method .annotation ;
18
18
19
+ import java .io .FilterInputStream ;
20
+ import java .io .IOException ;
21
+ import java .io .InputStream ;
19
22
import java .lang .reflect .Method ;
20
23
import java .nio .charset .StandardCharsets ;
21
24
import java .util .Arrays ;
@@ -83,6 +86,8 @@ public class RequestPartMethodArgumentResolverTests {
83
86
84
87
private MultipartFile multipartFile2 ;
85
88
89
+ private CloseTrackingInputStream trackedStream ;
90
+
86
91
private MockMultipartHttpServletRequest multipartRequest ;
87
92
88
93
private NativeWebRequest webRequest ;
@@ -116,7 +121,14 @@ public void setup() throws Exception {
116
121
reset (messageConverter );
117
122
118
123
byte [] content = "doesn't matter as long as not empty" .getBytes (StandardCharsets .UTF_8 );
119
- multipartFile1 = new MockMultipartFile ("requestPart" , "" , "text/plain" , content );
124
+ multipartFile1 = new MockMultipartFile ("requestPart" , "" , "text/plain" , content ) {
125
+ @ Override
126
+ public InputStream getInputStream () throws IOException {
127
+ CloseTrackingInputStream in = new CloseTrackingInputStream (super .getInputStream ());
128
+ trackedStream = in ;
129
+ return in ;
130
+ }
131
+ };
120
132
multipartFile2 = new MockMultipartFile ("requestPart" , "" , "text/plain" , content );
121
133
multipartRequest = new MockMultipartHttpServletRequest ();
122
134
multipartRequest .addFile (multipartFile1 );
@@ -182,17 +194,15 @@ public void resolveMultipartFile() throws Exception {
182
194
@ Test
183
195
public void resolveMultipartFileList () throws Exception {
184
196
Object actual = resolver .resolveArgument (paramMultipartFileList , null , webRequest , null );
185
- boolean condition = actual instanceof List ;
186
- assertThat (condition ).isTrue ();
197
+ assertThat (actual instanceof List ).isTrue ();
187
198
assertThat (actual ).isEqualTo (Arrays .asList (multipartFile1 , multipartFile2 ));
188
199
}
189
200
190
201
@ Test
191
202
public void resolveMultipartFileArray () throws Exception {
192
203
Object actual = resolver .resolveArgument (paramMultipartFileArray , null , webRequest , null );
193
204
assertThat (actual ).isNotNull ();
194
- boolean condition = actual instanceof MultipartFile [];
195
- assertThat (condition ).isTrue ();
205
+ assertThat (actual instanceof MultipartFile []).isTrue ();
196
206
MultipartFile [] parts = (MultipartFile []) actual ;
197
207
assertThat (parts .length ).isEqualTo (2 );
198
208
assertThat (multipartFile1 ).isEqualTo (parts [0 ]);
@@ -209,8 +219,7 @@ public void resolveMultipartFileNotAnnotArgument() throws Exception {
209
219
210
220
Object result = resolver .resolveArgument (paramMultipartFileNotAnnot , null , webRequest , null );
211
221
212
- boolean condition = result instanceof MultipartFile ;
213
- assertThat (condition ).isTrue ();
222
+ assertThat (result instanceof MultipartFile ).isTrue ();
214
223
assertThat (result ).as ("Invalid result" ).isEqualTo (expected );
215
224
}
216
225
@@ -225,8 +234,7 @@ public void resolvePartArgument() throws Exception {
225
234
webRequest = new ServletWebRequest (request );
226
235
227
236
Object result = resolver .resolveArgument (paramPart , null , webRequest , null );
228
- boolean condition = result instanceof Part ;
229
- assertThat (condition ).isTrue ();
237
+ assertThat (result instanceof Part ).isTrue ();
230
238
assertThat (result ).as ("Invalid result" ).isEqualTo (expected );
231
239
}
232
240
@@ -243,8 +251,7 @@ public void resolvePartListArgument() throws Exception {
243
251
webRequest = new ServletWebRequest (request );
244
252
245
253
Object result = resolver .resolveArgument (paramPartList , null , webRequest , null );
246
- boolean condition = result instanceof List ;
247
- assertThat (condition ).isTrue ();
254
+ assertThat (result instanceof List ).isTrue ();
248
255
assertThat (result ).isEqualTo (Arrays .asList (part1 , part2 ));
249
256
}
250
257
@@ -261,8 +268,7 @@ public void resolvePartArrayArgument() throws Exception {
261
268
webRequest = new ServletWebRequest (request );
262
269
263
270
Object result = resolver .resolveArgument (paramPartArray , null , webRequest , null );
264
- boolean condition = result instanceof Part [];
265
- assertThat (condition ).isTrue ();
271
+ assertThat (result instanceof Part []).isTrue ();
266
272
Part [] parts = (Part []) result ;
267
273
assertThat (parts .length ).isEqualTo (2 );
268
274
assertThat (part1 ).isEqualTo (parts [0 ]);
@@ -357,8 +363,7 @@ public void resolveOptionalMultipartFileArgument() throws Exception {
357
363
assertThat (((Optional <?>) actualValue ).get ()).as ("Invalid result" ).isEqualTo (expected );
358
364
359
365
actualValue = resolver .resolveArgument (optionalMultipartFile , null , webRequest , null );
360
- boolean condition = actualValue instanceof Optional ;
361
- assertThat (condition ).isTrue ();
366
+ assertThat (actualValue instanceof Optional ).isTrue ();
362
367
assertThat (((Optional <?>) actualValue ).get ()).as ("Invalid result" ).isEqualTo (expected );
363
368
}
364
369
@@ -399,8 +404,7 @@ public void resolveOptionalMultipartFileList() throws Exception {
399
404
assertThat (((Optional <?>) actualValue ).get ()).as ("Invalid result" ).isEqualTo (Collections .singletonList (expected ));
400
405
401
406
actualValue = resolver .resolveArgument (optionalMultipartFileList , null , webRequest , null );
402
- boolean condition = actualValue instanceof Optional ;
403
- assertThat (condition ).isTrue ();
407
+ assertThat (actualValue instanceof Optional ).isTrue ();
404
408
assertThat (((Optional <?>) actualValue ).get ()).as ("Invalid result" ).isEqualTo (Collections .singletonList (expected ));
405
409
}
406
410
@@ -443,8 +447,7 @@ public void resolveOptionalPartArgument() throws Exception {
443
447
assertThat (((Optional <?>) actualValue ).get ()).as ("Invalid result" ).isEqualTo (expected );
444
448
445
449
actualValue = resolver .resolveArgument (optionalPart , null , webRequest , null );
446
- boolean condition = actualValue instanceof Optional ;
447
- assertThat (condition ).isTrue ();
450
+ assertThat (actualValue instanceof Optional ).isTrue ();
448
451
assertThat (((Optional <?>) actualValue ).get ()).as ("Invalid result" ).isEqualTo (expected );
449
452
}
450
453
@@ -489,8 +492,7 @@ public void resolveOptionalPartList() throws Exception {
489
492
assertThat (((Optional <?>) actualValue ).get ()).as ("Invalid result" ).isEqualTo (Collections .singletonList (expected ));
490
493
491
494
actualValue = resolver .resolveArgument (optionalPartList , null , webRequest , null );
492
- boolean condition = actualValue instanceof Optional ;
493
- assertThat (condition ).isTrue ();
495
+ assertThat (actualValue instanceof Optional ).isTrue ();
494
496
assertThat (((Optional <?>) actualValue ).get ()).as ("Invalid result" ).isEqualTo (Collections .singletonList (expected ));
495
497
}
496
498
@@ -572,6 +574,7 @@ private void testResolveArgument(SimpleBean argValue, MethodParameter parameter)
572
574
Object actualValue = resolver .resolveArgument (parameter , mavContainer , webRequest , new ValidatingBinderFactory ());
573
575
assertThat (actualValue ).as ("Invalid argument value" ).isEqualTo (argValue );
574
576
assertThat (mavContainer .isRequestHandled ()).as ("The requestHandled flag shouldn't change" ).isFalse ();
577
+ assertThat (trackedStream != null && trackedStream .closed ).isTrue ();
575
578
}
576
579
577
580
@@ -591,7 +594,7 @@ public String getName() {
591
594
}
592
595
593
596
594
- private final class ValidatingBinderFactory implements WebDataBinderFactory {
597
+ private static class ValidatingBinderFactory implements WebDataBinderFactory {
595
598
596
599
@ Override
597
600
public WebDataBinder createBinder (NativeWebRequest webRequest , @ Nullable Object target ,
@@ -606,6 +609,21 @@ public WebDataBinder createBinder(NativeWebRequest webRequest, @Nullable Object
606
609
}
607
610
608
611
612
+ private static class CloseTrackingInputStream extends FilterInputStream {
613
+
614
+ public boolean closed = false ;
615
+
616
+ public CloseTrackingInputStream (InputStream in ) {
617
+ super (in );
618
+ }
619
+
620
+ @ Override
621
+ public void close () {
622
+ this .closed = true ;
623
+ }
624
+ }
625
+
626
+
609
627
@ SuppressWarnings ("unused" )
610
628
public void handle (
611
629
@ RequestPart SimpleBean requestPart ,
0 commit comments