From ea30c8fb5b3018b28746d0096640e2ab0175adf1 Mon Sep 17 00:00:00 2001 From: Bernie Schelberg Date: Tue, 24 Oct 2023 17:08:13 +1000 Subject: [PATCH] Return consistent collection type for matrix variables See gh-31483 --- .../MatrixVariableMapMethodArgumentResolver.java | 2 +- ...atrixVariablesMapMethodArgumentResolverTests.java | 12 ++++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/MatrixVariableMapMethodArgumentResolver.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/MatrixVariableMapMethodArgumentResolver.java index 313e1b9cd1..13d0446fea 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/MatrixVariableMapMethodArgumentResolver.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/MatrixVariableMapMethodArgumentResolver.java @@ -69,7 +69,7 @@ public class MatrixVariableMapMethodArgumentResolver implements HandlerMethodArg HandlerMapping.MATRIX_VARIABLES_ATTRIBUTE, RequestAttributes.SCOPE_REQUEST); if (CollectionUtils.isEmpty(matrixVariables)) { - return Collections.emptyMap(); + return (isSingleValueMap(parameter) ? Collections.emptyMap() : new LinkedMultiValueMap<>(0)); } MultiValueMap map = new LinkedMultiValueMap<>(); diff --git a/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/MatrixVariablesMapMethodArgumentResolverTests.java b/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/MatrixVariablesMapMethodArgumentResolverTests.java index b33e15cf1c..95d21fd05e 100644 --- a/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/MatrixVariablesMapMethodArgumentResolverTests.java +++ b/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/MatrixVariablesMapMethodArgumentResolverTests.java @@ -155,6 +155,18 @@ public class MatrixVariablesMapMethodArgumentResolverTests { assertThat(map).isEqualTo(Collections.emptyMap()); } + @Test + public void resolveMultiValueMapArgumentNoParams() throws Exception { + + MethodParameter param = this.testMethod.annot(matrixAttribute().noPathVar()) + .arg(MultiValueMap.class, String.class, String.class); + + Object result = this.resolver.resolveArgument(param, this.mavContainer, this.webRequest, null); + + //noinspection unchecked + assertThat(result).isInstanceOfSatisfying(MultiValueMap.class, map -> assertThat(map).isEmpty()); + } + @Test public void resolveArgumentNoMatch() throws Exception { MultiValueMap params2 = getVariablesFor("planes");