diff --git a/spring-core/src/main/java/org/springframework/util/LinkedMultiValueMap.java b/spring-core/src/main/java/org/springframework/util/LinkedMultiValueMap.java index 574b0eec83d8..05ba6f099f55 100644 --- a/spring-core/src/main/java/org/springframework/util/LinkedMultiValueMap.java +++ b/spring-core/src/main/java/org/springframework/util/LinkedMultiValueMap.java @@ -16,6 +16,8 @@ package org.springframework.util; +import org.jspecify.annotations.Nullable; + import java.io.Serializable; import java.util.ArrayList; import java.util.LinkedHashMap; @@ -31,11 +33,12 @@ * * @author Arjen Poutsma * @author Juergen Hoeller + * @author Yanming Zhou * @since 3.0 * @param the key type * @param the value element type */ -public class LinkedMultiValueMap extends MultiValueMapAdapter implements Serializable, Cloneable { +public class LinkedMultiValueMap extends MultiValueMapAdapter implements Serializable, Cloneable { private static final long serialVersionUID = 3801124242820219131L; diff --git a/spring-core/src/main/java/org/springframework/util/MultiValueMapAdapter.java b/spring-core/src/main/java/org/springframework/util/MultiValueMapAdapter.java index 6db806ba6f0c..726128c50501 100644 --- a/spring-core/src/main/java/org/springframework/util/MultiValueMapAdapter.java +++ b/spring-core/src/main/java/org/springframework/util/MultiValueMapAdapter.java @@ -31,6 +31,7 @@ * * @author Arjen Poutsma * @author Juergen Hoeller + * @author Yanming Zhou * @since 5.3 * @param the key type * @param the value element type @@ -38,7 +39,7 @@ * @see LinkedMultiValueMap */ @SuppressWarnings("serial") -public class MultiValueMapAdapter implements MultiValueMap, Serializable { +public class MultiValueMapAdapter implements MultiValueMap, Serializable { private final Map> targetMap; diff --git a/spring-core/src/main/java/org/springframework/util/UnmodifiableMultiValueMap.java b/spring-core/src/main/java/org/springframework/util/UnmodifiableMultiValueMap.java index 5ab48e4f0453..f8c4cb990917 100644 --- a/spring-core/src/main/java/org/springframework/util/UnmodifiableMultiValueMap.java +++ b/spring-core/src/main/java/org/springframework/util/UnmodifiableMultiValueMap.java @@ -39,11 +39,12 @@ * Unmodifiable wrapper for {@link MultiValueMap}. * * @author Arjen Poutsma + * @author Yanming Zhou * @since 6.0 * @param the key type * @param the value element type */ -final class UnmodifiableMultiValueMap implements MultiValueMap, Serializable { +final class UnmodifiableMultiValueMap implements MultiValueMap, Serializable { private static final long serialVersionUID = -8697084563854098920L; diff --git a/spring-core/src/test/java/org/springframework/util/LinkedMultiValueMapTests.java b/spring-core/src/test/java/org/springframework/util/LinkedMultiValueMapTests.java index fe1c8b2273d7..fa932e5f2339 100644 --- a/spring-core/src/test/java/org/springframework/util/LinkedMultiValueMapTests.java +++ b/spring-core/src/test/java/org/springframework/util/LinkedMultiValueMapTests.java @@ -23,6 +23,7 @@ import java.util.List; import java.util.Map; +import org.jspecify.annotations.Nullable; import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.assertThat; @@ -30,6 +31,7 @@ /** * @author Arjen Poutsma * @author Juergen Hoeller + * @author Yanming Zhou */ class LinkedMultiValueMapTests { @@ -130,4 +132,11 @@ void equals() { assertThat(map).isEqualTo(o2); } + @Test + void nullable() { + LinkedMultiValueMap map = new LinkedMultiValueMap<>(); + map.add("test", "test"); + map.add("test", null); + assertThat(map.get("test")).containsExactly("test", null); + } } diff --git a/spring-core/src/test/java/org/springframework/util/UnmodifiableMultiValueMapTests.java b/spring-core/src/test/java/org/springframework/util/UnmodifiableMultiValueMapTests.java index 6728cf7fe378..1e42b3030c55 100644 --- a/spring-core/src/test/java/org/springframework/util/UnmodifiableMultiValueMapTests.java +++ b/spring-core/src/test/java/org/springframework/util/UnmodifiableMultiValueMapTests.java @@ -24,6 +24,7 @@ import java.util.Set; import org.assertj.core.api.ThrowableTypeAssert; +import org.jspecify.annotations.Nullable; import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.assertThat; @@ -36,6 +37,7 @@ * Tests for {@link UnmodifiableMultiValueMap}. * * @author Arjen Poutsma + * @author Yanming Zhou * @since 6.0 */ class UnmodifiableMultiValueMapTests { @@ -179,6 +181,15 @@ void valuesUnsupported() { assertThatUnsupportedOperationException().isThrownBy(values::clear); } + @Test + void nullable() { + MultiValueMap linkedMultiValueMap = new LinkedMultiValueMap<>(); + linkedMultiValueMap.add("test", "test"); + linkedMultiValueMap.add("test", null); + UnmodifiableMultiValueMap map = new UnmodifiableMultiValueMap<>(linkedMultiValueMap); + assertThat(map.get("test")).containsExactly("test", null); + } + private static ThrowableTypeAssert assertThatUnsupportedOperationException() { return assertThatExceptionOfType(UnsupportedOperationException.class); }