Skip to content

Commit b00f691

Browse files
committed
Preserve parameter order in DefaultServerRequest's ServletParametersMap
Prior to this commit, DefaultServerRequest's ServletParametersMap lost the original parameter order when entrySet() was invoked. To address that, this commit revises ServletParametersMap.entrySet() so that it stores the results in a LinkedHashSet, thereby retaining the original order. Closes gh-36966
1 parent 6ac642e commit b00f691

2 files changed

Lines changed: 16 additions & 1 deletion

File tree

spring-webmvc/src/main/java/org/springframework/web/servlet/function/DefaultServerRequest.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
import java.util.Collections;
3434
import java.util.Enumeration;
3535
import java.util.Iterator;
36+
import java.util.LinkedHashSet;
3637
import java.util.List;
3738
import java.util.Locale;
3839
import java.util.Map;
@@ -443,7 +444,7 @@ public Set<Entry<String, List<String>>> entrySet() {
443444
List<String> value = Arrays.asList(entry.getValue());
444445
return new SimpleImmutableEntry<>(entry.getKey(), value);
445446
})
446-
.collect(Collectors.toSet());
447+
.collect(Collectors.toCollection(LinkedHashSet::new));
447448
}
448449

449450
@Override

spring-webmvc/src/test/java/org/springframework/web/servlet/function/DefaultServerRequestTests.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,20 @@ void params() {
167167
assertThat(request.param("foo")).contains("bar");
168168
}
169169

170+
@Test // gh-36966
171+
void paramsEntrySetPreservesOrder() {
172+
MockHttpServletRequest servletRequest = PathPatternsTestUtils.initRequest("GET", "/", true);
173+
servletRequest.setParameter("charlie", "3");
174+
servletRequest.setParameter("alpha", "1");
175+
servletRequest.setParameter("bravo", "2");
176+
177+
DefaultServerRequest request = new DefaultServerRequest(servletRequest, this.messageConverters);
178+
179+
assertThat(request.params().entrySet())
180+
.extracting(Map.Entry::getKey)
181+
.containsExactly("charlie", "alpha", "bravo");
182+
}
183+
170184
@Test
171185
void multipartData() throws Exception {
172186
MockPart formPart = new MockPart("form", "foo".getBytes(UTF_8));

0 commit comments

Comments
 (0)