diff --git a/spring-web/src/main/java/org/springframework/web/util/HierarchicalUriComponents.java b/spring-web/src/main/java/org/springframework/web/util/HierarchicalUriComponents.java index 65457686bde2..cd11cf9ea57f 100644 --- a/spring-web/src/main/java/org/springframework/web/util/HierarchicalUriComponents.java +++ b/spring-web/src/main/java/org/springframework/web/util/HierarchicalUriComponents.java @@ -22,6 +22,7 @@ import java.net.URISyntaxException; import java.nio.charset.Charset; import java.util.ArrayList; +import java.util.Collection; import java.util.Collections; import java.util.List; import java.util.Objects; @@ -47,6 +48,7 @@ * @author Rossen Stoyanchev * @author Phillip Webb * @author Sam Brannen + * @author Mengqi Xu * @since 3.1.3 * @see Hierarchical URIs */ @@ -1090,6 +1092,9 @@ public QueryUriTemplateVariables(UriTemplateVariables delegate) { if (ObjectUtils.isArray(value)) { value = StringUtils.arrayToCommaDelimitedString(ObjectUtils.toObjectArray(value)); } + if (value instanceof Collection coll) { + value = StringUtils.collectionToCommaDelimitedString(coll); + } return value; } } diff --git a/spring-web/src/test/java/org/springframework/web/util/UriComponentsTests.java b/spring-web/src/test/java/org/springframework/web/util/UriComponentsTests.java index 33fcbbe27a4e..d7d3fefd6dc1 100644 --- a/spring-web/src/test/java/org/springframework/web/util/UriComponentsTests.java +++ b/spring-web/src/test/java/org/springframework/web/util/UriComponentsTests.java @@ -23,6 +23,7 @@ import java.net.URI; import java.util.Arrays; import java.util.Collections; +import java.util.List; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; @@ -42,6 +43,7 @@ * @author Arjen Poutsma * @author Phillip Webb * @author Rossen Stoyanchev + * @author Mengqi Xu */ class UriComponentsTests { @@ -153,6 +155,26 @@ void expandWithFragmentOrder(ParserType parserType) { assertThat(uri.toUriString()).isEqualTo("https://example.com/foo#bar"); } + @Test + void expandQueryParamWithArray() { + UriComponents uri = UriComponentsBuilder.fromPath("/hello") + .queryParam("name", "{name}") + .build(); + uri = uri.expand(Collections.singletonMap("name", new String[]{"foo", "bar"})); + + assertThat(uri.toString()).hasToString("/hello?name=foo,bar"); + } + + @Test + void expandQueryParamWithList() { + UriComponents uri = UriComponentsBuilder.fromPath("/hello") + .queryParam("name", "{name}") + .build(); + uri = uri.expand(Collections.singletonMap("name", List.of("foo", "bar"))); + + assertThat(uri.toString()).hasToString("/hello?name=foo,bar"); + } + @ParameterizedTest // SPR-12123 @EnumSource void port(ParserType parserType) {