diff --git a/spring-core/src/main/java/org/springframework/core/io/FileUrlResource.java b/spring-core/src/main/java/org/springframework/core/io/FileUrlResource.java index 4e1b0fa80936..563a96a21111 100644 --- a/spring-core/src/main/java/org/springframework/core/io/FileUrlResource.java +++ b/spring-core/src/main/java/org/springframework/core/io/FileUrlResource.java @@ -59,6 +59,7 @@ public class FileUrlResource extends UrlResource implements WritableResource { */ public FileUrlResource(URL url) { super(url); + Assert.isTrue(ResourceUtils.isFileURL(url),"url's protocol must be file or start with vfs"); } /** @@ -96,7 +97,7 @@ public boolean isWritable() { return (file.canWrite() && !file.isDirectory()); } else { - return true; + return false; } } catch (IOException ex) { diff --git a/spring-core/src/test/java/org/springframework/core/io/ResourceTests.java b/spring-core/src/test/java/org/springframework/core/io/ResourceTests.java index 5a9c8e5d6d95..2f2d22c9af67 100644 --- a/spring-core/src/test/java/org/springframework/core/io/ResourceTests.java +++ b/spring-core/src/test/java/org/springframework/core/io/ResourceTests.java @@ -330,4 +330,11 @@ void readableChannelNotFoundOnClassPathResource() throws IOException { new ClassPathResource("Resource.class", getClass()).createRelative("X").readableChannel()); } + @Test + void fileUrlResourceTest() throws IOException { + assertThatIllegalArgumentException().isThrownBy(() -> { + new FileUrlResource(new URL("https://spring.io/")); + }); + } + }