diff --git a/spring-test/src/main/java/org/springframework/mock/web/MockServletContext.java b/spring-test/src/main/java/org/springframework/mock/web/MockServletContext.java index cd5b8d8769..e7b0b7737f 100644 --- a/spring-test/src/main/java/org/springframework/mock/web/MockServletContext.java +++ b/spring-test/src/main/java/org/springframework/mock/web/MockServletContext.java @@ -263,14 +263,12 @@ public class MockServletContext implements ServletContext { @Override public String getMimeType(String filePath) { String extension = StringUtils.getFilenameExtension(filePath); - MediaType result; if (this.mimeTypes.containsKey(extension)) { - result = this.mimeTypes.get(extension); + return this.mimeTypes.get(extension).toString(); } else { - result = MediaTypeFactory.getMediaType(filePath); + return MediaTypeFactory.getMediaType(filePath).orElse(MediaType.APPLICATION_OCTET_STREAM).toString(); } - return result != null ? result.toString() : null; } /** diff --git a/spring-web/src/main/java/org/springframework/http/MediaTypeFactory.java b/spring-web/src/main/java/org/springframework/http/MediaTypeFactory.java index 078ddfce4e..5dfe8c6aa2 100644 --- a/spring-web/src/main/java/org/springframework/http/MediaTypeFactory.java +++ b/spring-web/src/main/java/org/springframework/http/MediaTypeFactory.java @@ -103,9 +103,12 @@ public class MediaTypeFactory { * @param resource the resource to introspect * @return the corresponding media type, or {@code null} if none found */ - public static MediaType getMediaType(Resource resource) { + public static Optional getMediaType(Resource resource) { + if (resource == null) { + return Optional.empty(); + } String filename = resource.getFilename(); - return (filename != null ? getMediaType(filename) : null); + return (filename != null ? getMediaType(filename) : Optional.empty()); } /** @@ -113,9 +116,9 @@ public class MediaTypeFactory { * @param filename the file name plus extension * @return the corresponding media type, or {@code null} if none found */ - public static MediaType getMediaType(String filename) { + public static Optional getMediaType(String filename) { List mediaTypes = getMediaTypes(filename); - return (!mediaTypes.isEmpty() ? mediaTypes.get(0) : null); + return (!mediaTypes.isEmpty() ? Optional.of(mediaTypes.get(0)) : Optional.empty()); } /** diff --git a/spring-web/src/main/java/org/springframework/http/codec/ResourceHttpMessageWriter.java b/spring-web/src/main/java/org/springframework/http/codec/ResourceHttpMessageWriter.java index 3765d7ecc4..d074e9d234 100644 --- a/spring-web/src/main/java/org/springframework/http/codec/ResourceHttpMessageWriter.java +++ b/spring-web/src/main/java/org/springframework/http/codec/ResourceHttpMessageWriter.java @@ -136,8 +136,7 @@ public class ResourceHttpMessageWriter implements ServerHttpMessageWriter mediaType = MediaTypeFactory.getMediaType("file." + extension); + if (mediaType.isPresent()) { + return mediaType.get(); } if (this.ignoreUnknownExtensions) { return null; @@ -140,7 +141,7 @@ public class PathExtensionContentNegotiationStrategy extends AbstractMappingCont mediaType = lookupMediaType(extension); } if (mediaType == null) { - mediaType = MediaTypeFactory.getMediaType(filename); + mediaType = MediaTypeFactory.getMediaType(filename).orElse(null); } return mediaType; } diff --git a/spring-web/src/test/java/org/springframework/http/MediaTypeFactoryTests.java b/spring-web/src/test/java/org/springframework/http/MediaTypeFactoryTests.java index 9f547c5191..3ae5a1f8f8 100644 --- a/spring-web/src/test/java/org/springframework/http/MediaTypeFactoryTests.java +++ b/spring-web/src/test/java/org/springframework/http/MediaTypeFactoryTests.java @@ -18,7 +18,9 @@ package org.springframework.http; import org.junit.Test; -import static org.junit.Assert.assertEquals; +import org.springframework.core.io.Resource; + +import static org.junit.Assert.*; /** * @author Arjen Poutsma @@ -27,9 +29,17 @@ public class MediaTypeFactoryTests { @Test public void getMediaType() { - assertEquals(MediaType.APPLICATION_XML, MediaTypeFactory.getMediaType("file.xml")); - assertEquals(MediaType.parseMediaType("application/javascript"), MediaTypeFactory.getMediaType("file.js")); - assertEquals(MediaType.parseMediaType("text/css"), MediaTypeFactory.getMediaType("file.css")); + assertEquals(MediaType.APPLICATION_XML, MediaTypeFactory.getMediaType("file.xml").get()); + assertEquals(MediaType.parseMediaType("application/javascript"), MediaTypeFactory.getMediaType("file.js").get()); + assertEquals(MediaType.parseMediaType("text/css"), MediaTypeFactory.getMediaType("file.css").get()); + assertFalse(MediaTypeFactory.getMediaType("file.foobar").isPresent()); + } + + @Test + public void nullParameter() { + assertFalse(MediaTypeFactory.getMediaType((String) null).isPresent()); + assertFalse(MediaTypeFactory.getMediaType((Resource) null).isPresent()); + assertTrue(MediaTypeFactory.getMediaTypes(null).isEmpty()); } } \ No newline at end of file diff --git a/spring-web/src/test/java/org/springframework/mock/web/test/MockServletContext.java b/spring-web/src/test/java/org/springframework/mock/web/test/MockServletContext.java index eb0bc996b7..6dcacadcd9 100644 --- a/spring-web/src/test/java/org/springframework/mock/web/test/MockServletContext.java +++ b/spring-web/src/test/java/org/springframework/mock/web/test/MockServletContext.java @@ -262,14 +262,12 @@ public class MockServletContext implements ServletContext { @Override public String getMimeType(String filePath) { String extension = StringUtils.getFilenameExtension(filePath); - MediaType result; if (this.mimeTypes.containsKey(extension)) { - result = this.mimeTypes.get(extension); + return this.mimeTypes.get(extension).toString(); } else { - result = MediaTypeFactory.getMediaType(filePath); + return MediaTypeFactory.getMediaType(filePath).orElse(MediaType.APPLICATION_OCTET_STREAM).toString(); } - return result != null ? result.toString() : null; } /** diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/accept/PathExtensionContentTypeResolver.java b/spring-webflux/src/main/java/org/springframework/web/reactive/accept/PathExtensionContentTypeResolver.java index d32bdde74f..a7944b41b9 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/accept/PathExtensionContentTypeResolver.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/accept/PathExtensionContentTypeResolver.java @@ -18,6 +18,7 @@ package org.springframework.web.reactive.accept; import java.util.Locale; import java.util.Map; +import java.util.Optional; import org.springframework.core.io.Resource; import org.springframework.http.MediaType; @@ -79,9 +80,9 @@ public class PathExtensionContentTypeResolver extends AbstractMappingContentType @Override protected MediaType handleNoMatch(String key) throws NotAcceptableStatusException { - MediaType mediaType = MediaTypeFactory.getMediaType("file." + key); - if (mediaType != null) { - return mediaType; + Optional mediaType = MediaTypeFactory.getMediaType("file." + key); + if (mediaType.isPresent()) { + return mediaType.get(); } if (!this.ignoreUnknownExtensions) { throw new NotAcceptableStatusException(getAllMediaTypes()); @@ -105,7 +106,7 @@ public class PathExtensionContentTypeResolver extends AbstractMappingContentType mediaType = getMediaType(extension); } if (mediaType == null) { - mediaType = MediaTypeFactory.getMediaType(filename); + mediaType = MediaTypeFactory.getMediaType(filename).orElse(null); } return mediaType; }