diff --git a/spring-web/src/main/java/org/springframework/web/accept/AbstractMappingContentNegotiationStrategy.java b/spring-web/src/main/java/org/springframework/web/accept/AbstractMappingContentNegotiationStrategy.java index 3b48770ce90..6793856f7c2 100644 --- a/spring-web/src/main/java/org/springframework/web/accept/AbstractMappingContentNegotiationStrategy.java +++ b/spring-web/src/main/java/org/springframework/web/accept/AbstractMappingContentNegotiationStrategy.java @@ -148,9 +148,11 @@ public abstract class AbstractMappingContentNegotiationStrategy extends MappingM throws HttpMediaTypeNotAcceptableException { if (!isUseRegisteredExtensionsOnly()) { - Optional mediaType = MediaTypeFactory.getMediaType("file." + key); - if (mediaType.isPresent()) { - return mediaType.get(); + if (key.indexOf('.') == -1) { + Optional mediaType = MediaTypeFactory.getMediaType("file." + key); + if (mediaType.isPresent()) { + return mediaType.get(); + } } } if (isIgnoreUnknownExtensions()) { diff --git a/spring-web/src/main/java/org/springframework/web/accept/MappingMediaTypeFileExtensionResolver.java b/spring-web/src/main/java/org/springframework/web/accept/MappingMediaTypeFileExtensionResolver.java index 130f2bd5cf7..28680bdebf9 100644 --- a/spring-web/src/main/java/org/springframework/web/accept/MappingMediaTypeFileExtensionResolver.java +++ b/spring-web/src/main/java/org/springframework/web/accept/MappingMediaTypeFileExtensionResolver.java @@ -57,7 +57,7 @@ public class MappingMediaTypeFileExtensionResolver implements MediaTypeFileExten public MappingMediaTypeFileExtensionResolver(@Nullable Map mediaTypes) { if (mediaTypes != null) { Set allFileExtensions = CollectionUtils.newHashSet(mediaTypes.size()); - mediaTypes.forEach((extension, mediaType) -> addMapping(extension.toLowerCase(Locale.ROOT), mediaType)); + mediaTypes.forEach(this::addMapping); this.allFileExtensions.addAll(allFileExtensions); } } @@ -74,12 +74,12 @@ public class MappingMediaTypeFileExtensionResolver implements MediaTypeFileExten /** * Map an extension to a MediaType. Ignore if extension already mapped. */ - protected void addMapping(String extension, MediaType mediaType) { - MediaType previous = this.mediaTypes.putIfAbsent(extension, mediaType); + protected void addMapping(String key, MediaType mediaType) { + key = key.toLowerCase(Locale.ROOT); + MediaType previous = this.mediaTypes.putIfAbsent(key, mediaType); if (previous == null) { - this.fileExtensions.computeIfAbsent( - mediaType, key -> new CopyOnWriteArrayList<>()).add(extension); - this.allFileExtensions.add(extension); + this.fileExtensions.computeIfAbsent(mediaType, k -> new CopyOnWriteArrayList<>()).add(key); + this.allFileExtensions.add(key); } } diff --git a/spring-web/src/test/java/org/springframework/web/accept/MappingContentNegotiationStrategyTests.java b/spring-web/src/test/java/org/springframework/web/accept/MappingContentNegotiationStrategyTests.java index 14f9d5d40f3..8bea3227389 100644 --- a/spring-web/src/test/java/org/springframework/web/accept/MappingContentNegotiationStrategyTests.java +++ b/spring-web/src/test/java/org/springframework/web/accept/MappingContentNegotiationStrategyTests.java @@ -49,7 +49,7 @@ class MappingContentNegotiationStrategyTests { } @Test - void resolveMediaTypesViaMediaTypeFactory() throws Exception { + void resolveMediaTypesViaFactory() throws Exception { Map mapping = null; TestMappingContentNegotiationStrategy strategy = new TestMappingContentNegotiationStrategy("xml", mapping); @@ -68,6 +68,15 @@ class MappingContentNegotiationStrategyTests { .isInstanceOf(HttpMediaTypeNotAcceptableException.class); } + @Test + void resolveMediaTypesInvalidKey() { + Map mapping = null; + TestMappingContentNegotiationStrategy strategy = new TestMappingContentNegotiationStrategy("not.json", mapping); + + assertThatThrownBy(() -> strategy.resolveMediaTypes(null)) + .isInstanceOf(HttpMediaTypeNotAcceptableException.class); + } + @Test void resolveMediaTypesNullKey() throws Exception { Map mapping = Collections.singletonMap("json", MediaType.APPLICATION_JSON); diff --git a/spring-web/src/test/java/org/springframework/web/accept/MappingMediaTypeFileExtensionResolverTests.java b/spring-web/src/test/java/org/springframework/web/accept/MappingMediaTypeFileExtensionResolverTests.java index b003a9825a7..652b87b6a78 100644 --- a/spring-web/src/test/java/org/springframework/web/accept/MappingMediaTypeFileExtensionResolverTests.java +++ b/spring-web/src/test/java/org/springframework/web/accept/MappingMediaTypeFileExtensionResolverTests.java @@ -75,6 +75,8 @@ class MappingMediaTypeFileExtensionResolverTests { map.put("jSoN", MediaType.APPLICATION_JSON); MappingMediaTypeFileExtensionResolver resolver = new MappingMediaTypeFileExtensionResolver(map); + map.forEach(resolver::addMapping); + assertThat(resolver.getAllFileExtensions()).containsExactly("json"); }