@@ -84,6 +84,8 @@ public class RequestParamMethodArgumentResolverTests {
8484 private MethodParameter paramRequired ;
8585 private MethodParameter paramNotRequired ;
8686 private MethodParameter paramOptional ;
87+ private MethodParameter paramOptionalArray ;
88+ private MethodParameter paramOptionalList ;
8789 private MethodParameter multipartFileOptional ;
8890
8991 private NativeWebRequest webRequest ;
@@ -119,7 +121,9 @@ public void setUp() throws Exception {
119121 paramRequired = new SynthesizingMethodParameter (method , 15 );
120122 paramNotRequired = new SynthesizingMethodParameter (method , 16 );
121123 paramOptional = new SynthesizingMethodParameter (method , 17 );
122- multipartFileOptional = new SynthesizingMethodParameter (method , 18 );
124+ paramOptionalArray = new SynthesizingMethodParameter (method , 18 );
125+ paramOptionalList = new SynthesizingMethodParameter (method , 19 );
126+ multipartFileOptional = new SynthesizingMethodParameter (method , 20 );
123127
124128 request = new MockHttpServletRequest ();
125129 webRequest = new ServletWebRequest (request , new MockHttpServletResponse ());
@@ -437,6 +441,83 @@ public void resolveOptionalParamValue() throws Exception {
437441 assertEquals (123 , ((Optional ) result ).get ());
438442 }
439443
444+ @ Test
445+ @ SuppressWarnings ("rawtypes" )
446+ public void missingOptionalParamValue () throws Exception {
447+ ConfigurableWebBindingInitializer initializer = new ConfigurableWebBindingInitializer ();
448+ initializer .setConversionService (new DefaultConversionService ());
449+ WebDataBinderFactory binderFactory = new DefaultDataBinderFactory (initializer );
450+
451+ Object result = resolver .resolveArgument (paramOptional , null , webRequest , binderFactory );
452+ assertEquals (Optional .empty (), result );
453+
454+ result = resolver .resolveArgument (paramOptional , null , webRequest , binderFactory );
455+ assertEquals (Optional .class , result .getClass ());
456+ assertFalse (((Optional ) result ).isPresent ());
457+ }
458+
459+ @ Test
460+ @ SuppressWarnings ("rawtypes" )
461+ public void resolveOptionalParamArray () throws Exception {
462+ ConfigurableWebBindingInitializer initializer = new ConfigurableWebBindingInitializer ();
463+ initializer .setConversionService (new DefaultConversionService ());
464+ WebDataBinderFactory binderFactory = new DefaultDataBinderFactory (initializer );
465+
466+ Object result = resolver .resolveArgument (paramOptionalArray , null , webRequest , binderFactory );
467+ assertEquals (Optional .empty (), result );
468+
469+ this .request .addParameter ("name" , "123" , "456" );
470+ result = resolver .resolveArgument (paramOptionalArray , null , webRequest , binderFactory );
471+ assertEquals (Optional .class , result .getClass ());
472+ assertArrayEquals (new Integer [] {123 , 456 }, (Integer []) ((Optional ) result ).get ());
473+ }
474+
475+ @ Test
476+ @ SuppressWarnings ("rawtypes" )
477+ public void missingOptionalParamArray () throws Exception {
478+ ConfigurableWebBindingInitializer initializer = new ConfigurableWebBindingInitializer ();
479+ initializer .setConversionService (new DefaultConversionService ());
480+ WebDataBinderFactory binderFactory = new DefaultDataBinderFactory (initializer );
481+
482+ Object result = resolver .resolveArgument (paramOptionalArray , null , webRequest , binderFactory );
483+ assertEquals (Optional .empty (), result );
484+
485+ result = resolver .resolveArgument (paramOptionalArray , null , webRequest , binderFactory );
486+ assertEquals (Optional .class , result .getClass ());
487+ assertFalse (((Optional ) result ).isPresent ());
488+ }
489+
490+ @ Test
491+ @ SuppressWarnings ("rawtypes" )
492+ public void resolveOptionalParamList () throws Exception {
493+ ConfigurableWebBindingInitializer initializer = new ConfigurableWebBindingInitializer ();
494+ initializer .setConversionService (new DefaultConversionService ());
495+ WebDataBinderFactory binderFactory = new DefaultDataBinderFactory (initializer );
496+
497+ Object result = resolver .resolveArgument (paramOptionalList , null , webRequest , binderFactory );
498+ assertEquals (Optional .empty (), result );
499+
500+ this .request .addParameter ("name" , "123" , "456" );
501+ result = resolver .resolveArgument (paramOptionalList , null , webRequest , binderFactory );
502+ assertEquals (Optional .class , result .getClass ());
503+ assertEquals (Arrays .asList ("123" , "456" ), ((Optional ) result ).get ());
504+ }
505+
506+ @ Test
507+ @ SuppressWarnings ("rawtypes" )
508+ public void missingOptionalParamList () throws Exception {
509+ ConfigurableWebBindingInitializer initializer = new ConfigurableWebBindingInitializer ();
510+ initializer .setConversionService (new DefaultConversionService ());
511+ WebDataBinderFactory binderFactory = new DefaultDataBinderFactory (initializer );
512+
513+ Object result = resolver .resolveArgument (paramOptionalList , null , webRequest , binderFactory );
514+ assertEquals (Optional .empty (), result );
515+
516+ result = resolver .resolveArgument (paramOptionalList , null , webRequest , binderFactory );
517+ assertEquals (Optional .class , result .getClass ());
518+ assertFalse (((Optional ) result ).isPresent ());
519+ }
520+
440521 @ Test
441522 public void resolveOptionalMultipartFile () throws Exception {
442523 ConfigurableWebBindingInitializer initializer = new ConfigurableWebBindingInitializer ();
@@ -493,6 +574,8 @@ public void handle(
493574 @ RequestParam ("name" ) String paramRequired ,
494575 @ RequestParam (name = "name" , required = false ) String paramNotRequired ,
495576 @ RequestParam ("name" ) Optional <Integer > paramOptional ,
577+ @ RequestParam ("name" ) Optional <Integer []> paramOptionalArray ,
578+ @ RequestParam ("name" ) Optional <List > paramOptionalList ,
496579 @ RequestParam ("mfile" ) Optional <MultipartFile > multipartFileOptional ) {
497580 }
498581
0 commit comments