Skip to content

Commit ea10ee5

Browse files
nosanrstoyanchev
authored andcommitted
queryParam and replaceParam with List
See gh-23114
1 parent 0d3e5db commit ea10ee5

File tree

4 files changed

+118
-5
lines changed

4 files changed

+118
-5
lines changed

spring-web/src/main/java/org/springframework/web/util/DefaultUriBuilderFactory.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
package org.springframework.web.util;
1818

1919
import java.net.URI;
20+
import java.util.Collection;
2021
import java.util.Collections;
2122
import java.util.HashMap;
2223
import java.util.Map;
@@ -326,12 +327,24 @@ public DefaultUriBuilder queryParam(String name, Object... values) {
326327
return this;
327328
}
328329

330+
@Override
331+
public DefaultUriBuilder queryParams(String name, @Nullable Collection<?> values) {
332+
this.uriComponentsBuilder.queryParams(name, values);
333+
return this;
334+
}
335+
329336
@Override
330337
public DefaultUriBuilder replaceQueryParam(String name, Object... values) {
331338
this.uriComponentsBuilder.replaceQueryParam(name, values);
332339
return this;
333340
}
334341

342+
@Override
343+
public DefaultUriBuilder replaceQueryParams(String name, @Nullable Collection<?> values) {
344+
this.uriComponentsBuilder.replaceQueryParams(name, values);
345+
return this;
346+
}
347+
335348
@Override
336349
public DefaultUriBuilder queryParams(MultiValueMap<String, String> params) {
337350
this.uriComponentsBuilder.queryParams(params);

spring-web/src/main/java/org/springframework/web/util/UriBuilder.java

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2002-2018 the original author or authors.
2+
* Copyright 2002-2019 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -17,6 +17,7 @@
1717
package org.springframework.web.util;
1818

1919
import java.net.URI;
20+
import java.util.Collection;
2021
import java.util.Map;
2122

2223
import org.springframework.lang.Nullable;
@@ -124,9 +125,22 @@ public interface UriBuilder {
124125
* only (i.e. {@code ?foo} instead of {@code ?foo=bar}.
125126
* @param name the query parameter name
126127
* @param values the query parameter values
128+
* @see #queryParams(String, Collection)
127129
*/
128130
UriBuilder queryParam(String name, Object... values);
129131

132+
/**
133+
* Append the given query parameter to the existing query parameters. The
134+
* given name or any of the values may contain URI template variables. If no
135+
* values are given, the resulting URI will contain the query parameter name
136+
* only (i.e. {@code ?foo} instead of {@code ?foo=bar}.
137+
* @param name the query parameter name
138+
* @param values the query parameter values
139+
* @since 5.2.0
140+
* @see #queryParam(String, Object...)
141+
*/
142+
UriBuilder queryParams(String name, @Nullable Collection<?> values);
143+
130144
/**
131145
* Add the given query parameters.
132146
* @param params the params
@@ -138,9 +152,20 @@ public interface UriBuilder {
138152
* the same parameter. If no values are given, the query parameter is removed.
139153
* @param name the query parameter name
140154
* @param values the query parameter values
155+
* @see #replaceQueryParams(String, Collection)
141156
*/
142157
UriBuilder replaceQueryParam(String name, Object... values);
143158

159+
/**
160+
* Set the query parameter values overriding all existing query values for
161+
* the same parameter. If no values are given, the query parameter is removed.
162+
* @param name the query parameter name
163+
* @param values the query parameter values
164+
* @since 5.2.0
165+
* @see #replaceQueryParam(String, Object...)
166+
*/
167+
UriBuilder replaceQueryParams(String name, @Nullable Collection<?> values);
168+
144169
/**
145170
* Set the query parameter values overriding all existing query values.
146171
* @param params the query parameter name

spring-web/src/main/java/org/springframework/web/util/UriComponentsBuilder.java

Lines changed: 39 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,9 @@
2020
import java.nio.charset.Charset;
2121
import java.nio.charset.StandardCharsets;
2222
import java.util.ArrayList;
23+
import java.util.Arrays;
24+
import java.util.Collection;
25+
import java.util.Collections;
2326
import java.util.HashMap;
2427
import java.util.LinkedList;
2528
import java.util.List;
@@ -31,6 +34,7 @@
3134
import org.springframework.http.HttpRequest;
3235
import org.springframework.lang.Nullable;
3336
import org.springframework.util.Assert;
37+
import org.springframework.util.CollectionUtils;
3438
import org.springframework.util.LinkedMultiValueMap;
3539
import org.springframework.util.MultiValueMap;
3640
import org.springframework.util.ObjectUtils;
@@ -696,11 +700,28 @@ public UriComponentsBuilder replaceQuery(@Nullable String query) {
696700
* @param name the query parameter name
697701
* @param values the query parameter values
698702
* @return this UriComponentsBuilder
703+
* @see #queryParams(String, Collection)
699704
*/
700705
@Override
701706
public UriComponentsBuilder queryParam(String name, Object... values) {
707+
return queryParams(name, (!ObjectUtils.isEmpty(values) ? Arrays.asList(values) : Collections.emptyList()));
708+
}
709+
710+
/**
711+
* Append the given query parameter to the existing query parameters. The
712+
* given name or any of the values may contain URI template variables. If no
713+
* values are given, the resulting URI will contain the query parameter name
714+
* only (i.e. {@code ?foo} instead of {@code ?foo=bar}).
715+
* @param name the query parameter name
716+
* @param values the query parameter values
717+
* @return this UriComponentsBuilder
718+
* @since 5.2.0
719+
* @see #queryParam(String, Object...)
720+
*/
721+
@Override
722+
public UriComponentsBuilder queryParams(String name, @Nullable Collection<?> values) {
702723
Assert.notNull(name, "Name must not be null");
703-
if (!ObjectUtils.isEmpty(values)) {
724+
if (!CollectionUtils.isEmpty(values)) {
704725
for (Object value : values) {
705726
String valueAsString = (value != null ? value.toString() : null);
706727
this.queryParams.add(name, valueAsString);
@@ -733,13 +754,28 @@ public UriComponentsBuilder queryParams(@Nullable MultiValueMap<String, String>
733754
* @param name the query parameter name
734755
* @param values the query parameter values
735756
* @return this UriComponentsBuilder
757+
* @see #replaceQueryParams(String, Collection)
736758
*/
737759
@Override
738760
public UriComponentsBuilder replaceQueryParam(String name, Object... values) {
761+
return replaceQueryParams(name, (!ObjectUtils.isEmpty(values) ? Arrays.asList(values) : Collections.emptyList()));
762+
}
763+
764+
/**
765+
* Set the query parameter values overriding all existing query values for
766+
* the same parameter. If no values are given, the query parameter is removed.
767+
* @param name the query parameter name
768+
* @param values the query parameter values
769+
* @return this UriComponentsBuilder
770+
* @see #replaceQueryParam(String, Object...)
771+
* @since 5.2.0
772+
*/
773+
@Override
774+
public UriComponentsBuilder replaceQueryParams(String name, @Nullable Collection<?> values) {
739775
Assert.notNull(name, "Name must not be null");
740776
this.queryParams.remove(name);
741-
if (!ObjectUtils.isEmpty(values)) {
742-
queryParam(name, values);
777+
if (!CollectionUtils.isEmpty(values)) {
778+
queryParams(name, values);
743779
}
744780
resetSchemeSpecificPart();
745781
return this;

spring-web/src/test/java/org/springframework/web/util/UriComponentsBuilderTests.java

Lines changed: 40 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -643,7 +643,7 @@ public void replaceQuery() {
643643
}
644644

645645
@Test
646-
public void queryParams() {
646+
public void queryParam() {
647647
UriComponentsBuilder builder = UriComponentsBuilder.newInstance();
648648
UriComponents result = builder.queryParam("baz", "qux", 42).build();
649649

@@ -654,6 +654,18 @@ public void queryParams() {
654654
assertThat(result.getQueryParams()).isEqualTo(expectedQueryParams);
655655
}
656656

657+
@Test
658+
public void queryParams() {
659+
UriComponentsBuilder builder = UriComponentsBuilder.newInstance();
660+
UriComponents result = builder.queryParams("baz", Arrays.asList("qux", 42)).build();
661+
662+
assertThat(result.getQuery()).isEqualTo("baz=qux&baz=42");
663+
MultiValueMap<String, String> expectedQueryParams = new LinkedMultiValueMap<>(2);
664+
expectedQueryParams.add("baz", "qux");
665+
expectedQueryParams.add("baz", "42");
666+
assertThat(result.getQueryParams()).isEqualTo(expectedQueryParams);
667+
}
668+
657669
@Test
658670
public void emptyQueryParam() {
659671
UriComponentsBuilder builder = UriComponentsBuilder.newInstance();
@@ -665,6 +677,18 @@ public void emptyQueryParam() {
665677
assertThat(result.getQueryParams()).isEqualTo(expectedQueryParams);
666678
}
667679

680+
@Test
681+
public void emptyQueryParams() {
682+
UriComponentsBuilder builder = UriComponentsBuilder.newInstance();
683+
UriComponents result = builder.queryParams("baz", Collections.emptyList()).queryParams("foo", null).build();
684+
685+
assertThat(result.getQuery()).isEqualTo("baz&foo");
686+
MultiValueMap<String, String> expectedQueryParams = new LinkedMultiValueMap<>(2);
687+
expectedQueryParams.add("baz", null);
688+
expectedQueryParams.add("foo", null);
689+
assertThat(result.getQueryParams()).isEqualTo(expectedQueryParams);
690+
}
691+
668692
@Test
669693
public void replaceQueryParam() {
670694
UriComponentsBuilder builder = UriComponentsBuilder.newInstance().queryParam("baz", "qux", 42);
@@ -680,6 +704,21 @@ public void replaceQueryParam() {
680704
assertThat(result.getQuery()).as("Query param should have been deleted").isNull();
681705
}
682706

707+
@Test
708+
public void replaceQueryParams() {
709+
UriComponentsBuilder builder = UriComponentsBuilder.newInstance().queryParams("baz", Arrays.asList("qux", 42));
710+
builder.replaceQueryParams("baz", Arrays.asList("xuq", 24));
711+
UriComponents result = builder.build();
712+
713+
assertThat(result.getQuery()).isEqualTo("baz=xuq&baz=24");
714+
715+
builder = UriComponentsBuilder.newInstance().queryParams("baz", Arrays.asList("qux", 42));
716+
builder.replaceQueryParams("baz", Collections.emptyList());
717+
result = builder.build();
718+
719+
assertThat(result.getQuery()).as("Query param should have been deleted").isNull();
720+
}
721+
683722
@Test
684723
public void buildAndExpandHierarchical() {
685724
UriComponents result = UriComponentsBuilder.fromPath("/{foo}").buildAndExpand("fooValue");

0 commit comments

Comments
 (0)