From 9efe468a34c8043567acb2e9725606c0f413beb8 Mon Sep 17 00:00:00 2001 From: zhoubiao188 <32508238+zhoubiao188@users.noreply.github.com> Date: Sun, 18 Oct 2026 11:20:34 +0800 Subject: [PATCH] Copy lazily loaded MIME mappings when constructing MimeMappings `MimeMappings.DEFAULT` is a `DefaultMimeMappings` that keeps its mappings in a lazily loaded map. The copy constructor and `unmodifiableMappings` read the internal `map` field directly, which is always empty for `DEFAULT`, so a copy of the default mappings was empty and lost all 1021 default entries. The same field access in `equals` also made comparisons asymmetric: a copy of `DEFAULT` considered itself equal to `DEFAULT` while `DEFAULT` considered itself different from the copy. Use the (possibly overridden) `getMap()` method when copying and comparing so that lazily loaded mappings are taken into account. Signed-off-by: zhoubiao188 <32508238+zhoubiao188@users.noreply.github.com> --- .../boot/web/server/MimeMappings.java | 5 +++-- .../boot/web/server/MimeMappingsTests.java | 22 +++++++++++++++++++ 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/module/spring-boot-web-server/src/main/java/org/springframework/boot/web/server/MimeMappings.java b/module/spring-boot-web-server/src/main/java/org/springframework/boot/web/server/MimeMappings.java index 1a0c44f8a5f4..0257d500fc44 100644 --- a/module/spring-boot-web-server/src/main/java/org/springframework/boot/web/server/MimeMappings.java +++ b/module/spring-boot-web-server/src/main/java/org/springframework/boot/web/server/MimeMappings.java @@ -72,7 +72,8 @@ public MimeMappings(Map mappings) { */ MimeMappings(MimeMappings mappings, boolean mutable) { Assert.notNull(mappings, "'mappings' must not be null"); - this.map = (mutable ? new LinkedHashMap<>(mappings.map) : Collections.unmodifiableMap(mappings.map)); + Map source = mappings.getMap(); + this.map = (mutable ? new LinkedHashMap<>(source) : Collections.unmodifiableMap(source)); } /** @@ -132,7 +133,7 @@ public boolean equals(Object obj) { return true; } if (obj instanceof MimeMappings other) { - return getMap().equals(other.map); + return getMap().equals(other.getMap()); } return false; } diff --git a/module/spring-boot-web-server/src/test/java/org/springframework/boot/web/server/MimeMappingsTests.java b/module/spring-boot-web-server/src/test/java/org/springframework/boot/web/server/MimeMappingsTests.java index 7343cc9e563a..28062f1ac683 100644 --- a/module/spring-boot-web-server/src/test/java/org/springframework/boot/web/server/MimeMappingsTests.java +++ b/module/spring-boot-web-server/src/test/java/org/springframework/boot/web/server/MimeMappingsTests.java @@ -51,6 +51,28 @@ void createFromExisting() { assertThat(clone.get("baz")).isNull(); } + @Test + void createFromDefault() { + MimeMappings clone = new MimeMappings(MimeMappings.DEFAULT); + assertThat(clone).hasSameSizeAs(MimeMappings.DEFAULT); + assertThat(clone.get("html")).isEqualTo("text/html"); + clone.add("foo", "bar"); + assertThat(MimeMappings.DEFAULT.get("foo")).isNull(); + } + + @Test + void makeUnmodifiableFromDefault() { + MimeMappings unmodifiable = MimeMappings.unmodifiableMappings(MimeMappings.DEFAULT); + assertThat(unmodifiable.get("html")).isEqualTo("text/html"); + } + + @Test + void equalsIsSymmetricWithDefault() { + MimeMappings clone = new MimeMappings(MimeMappings.DEFAULT); + assertThat(clone).isEqualTo(MimeMappings.DEFAULT); + assertThat(MimeMappings.DEFAULT).isEqualTo(clone); + } + @Test void createFromMap() { Map mappings = new HashMap<>();