diff --git a/spring-core/src/main/java/org/springframework/util/LinkedCaseInsensitiveMap.java b/spring-core/src/main/java/org/springframework/util/LinkedCaseInsensitiveMap.java index fe69026961..91e4b1f41d 100644 --- a/spring-core/src/main/java/org/springframework/util/LinkedCaseInsensitiveMap.java +++ b/spring-core/src/main/java/org/springframework/util/LinkedCaseInsensitiveMap.java @@ -36,7 +36,7 @@ import java.util.Map; @SuppressWarnings("serial") public class LinkedCaseInsensitiveMap extends LinkedHashMap { - private final Map caseInsensitiveKeys; + private Map caseInsensitiveKeys; private final Locale locale; @@ -151,6 +151,14 @@ public class LinkedCaseInsensitiveMap extends LinkedHashMap { super.clear(); } + @Override + @SuppressWarnings("unchecked") + public Object clone() { + LinkedCaseInsensitiveMap copy = (LinkedCaseInsensitiveMap) super.clone(); + copy.caseInsensitiveKeys = new HashMap<>(this.caseInsensitiveKeys); + return copy; + } + /** * Convert the given key to a case-insensitive key. diff --git a/spring-core/src/test/java/org/springframework/util/LinkedCaseInsensitiveMapTests.java b/spring-core/src/test/java/org/springframework/util/LinkedCaseInsensitiveMapTests.java index dd2dc28e7d..1b3f757bd2 100644 --- a/spring-core/src/test/java/org/springframework/util/LinkedCaseInsensitiveMapTests.java +++ b/spring-core/src/test/java/org/springframework/util/LinkedCaseInsensitiveMapTests.java @@ -74,4 +74,26 @@ public class LinkedCaseInsensitiveMapTests { assertEquals("N", map.getOrDefault(new Object(), "N")); } + @Test + @SuppressWarnings("unchecked") + public void mapClone() { + map.put("key", "value1"); + LinkedCaseInsensitiveMap copy = (LinkedCaseInsensitiveMap) map.clone(); + assertEquals("value1", map.get("key")); + assertEquals("value1", map.get("KEY")); + assertEquals("value1", map.get("Key")); + assertEquals("value1", copy.get("key")); + assertEquals("value1", copy.get("KEY")); + assertEquals("value1", copy.get("Key")); + copy.put("Key", "value2"); + assertEquals(1, map.size()); + assertEquals(1, copy.size()); + assertEquals("value1", map.get("key")); + assertEquals("value1", map.get("KEY")); + assertEquals("value1", map.get("Key")); + assertEquals("value2", copy.get("key")); + assertEquals("value2", copy.get("KEY")); + assertEquals("value2", copy.get("Key")); + } + }