spring-attic / spring-cloud-gcp

Integration for Google Cloud Platform APIs with Spring
Apache License 2.0
705 stars 693 forks source link

Adding spring-devtools to dependencies breaks resolving of gs://-resources #1736

Open ghost opened 5 years ago

ghost commented 5 years ago

When adding spring-devtools to the dependencies of a project using spring-cloud-gcp-starter-storage the resolution of gs://-resources won't work any more.

How to reproduce:

Simply use the gcp-storage-example at https://github.com/spring-cloud/spring-cloud-gcp/tree/master/spring-cloud-gcp-samples/spring-cloud-gcp-storage-resource-sample

If you add

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-devtools</artifactId>
</dependency>

to the pom.xml you will get this exception:

Could not open ServletContext resource [/gs://bucket/filename]
java.io.FileNotFoundException: Could not open ServletContext resource [/gs://bucket/filename]
at org.springframework.web.context.support.ServletContextResource.getInputStream(ServletContextResource.java:158)
at com.example.WebController.readGcsFile(WebController.java:48)

I think this is related to https://github.com/spring-cloud/spring-cloud-aws/issues/384 which was auto-closed.

If you think this is NOT an issue in spring-cloud but in spring-devtools please tell me. I'm willing to open an issue there, too.

meltsufin commented 5 years ago

We can keep it open here for now, but it looks like it's related to https://github.com/spring-projects/spring-boot/issues/17214.

stoan commented 5 years ago

I get the following error if Devtools is active

java.nio.file.InvalidPathException: Illegal char <:> at index 18: src\main\webapp\s3:\swooop\rootFile.log

    at sun.nio.fs.WindowsPathParser.normalize(WindowsPathParser.java:182)
    at sun.nio.fs.WindowsPathParser.parse(WindowsPathParser.java:153)
    at sun.nio.fs.WindowsPathParser.parse(WindowsPathParser.java:77)
    at sun.nio.fs.WindowsPath.parse(WindowsPath.java:94)
    at sun.nio.fs.WindowsFileSystem.getPath(WindowsFileSystem.java:255)
    at java.io.File.toPath(File.java:2234)
    at org.springframework.core.io.FileSystemResource.<init>(FileSystemResource.java:82)
    at org.springframework.core.io.FileSystemResourceLoader$FileSystemContextResource.<init>(FileSystemResourceLoader.java:65)
    at org.springframework.core.io.FileSystemResourceLoader.getResourceByPath(FileSystemResourceLoader.java:54)
    at org.springframework.core.io.DefaultResourceLoader.getResource(DefaultResourceLoader.java:168)
    at org.springframework.mock.web.MockServletContext.getResourceAsStream(MockServletContext.java:345)
    at org.springframework.web.context.support.ServletContextResource.getInputStream(ServletContextResource.java:156)
    at com.housescent.sweeep.SweeepCoreApplicationTests.resourceLoadingMethod(SweeepCoreApplicationTests.java:30)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
    at org.springframework.test.context.junit4.statements.RunBeforeTestExecutionCallbacks.evaluate(RunBeforeTestExecutionCallbacks.java:74)
    at org.springframework.test.context.junit4.statements.RunAfterTestExecutionCallbacks.evaluate(RunAfterTestExecutionCallbacks.java:84)
    at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:75)
    at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:86)
    at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:84)
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:251)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:97)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
    at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
    at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:190)
    at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
    at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)
    at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47)
    at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242)
    at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)
@RunWith(SpringRunner.class)
@SpringBootTest
public class SweeepCoreApplicationTests {

    @Autowired
    private ResourceLoader resourceLoader;

    @Test
    public void contextLoads() {
    }

    @Test
    public void resourceLoadingMethod() throws IOException {
        Resource resource = this.resourceLoader.getResource("s3://swooop/rootFile.log");
        Resource secondResource = this.resourceLoader.getResource("s3://myBucket/rootFolder/subFile");

        InputStream inputStream = resource.getInputStream();
        //read file
    }

}