我有一个Spring Boot应用程序,其中正在使用文件。在配置属性文件中配置文件位置。 由于我升级了spring-boot版本,因此无法再找到该文件。
升级
我从Spring Boot 1.5.10.RELEASE升级到1.5.11.RELEASE。 由于该更改,我有了一个新的Spring依赖项(4.3.14-> 4.3.15)。
设置
我有一个属性文件(application.yml
),该文件具有我在配置Pojo上与@ConfigurationProperties
一起解析的属性。属性之一(称为file
)的类型为java.io.File
。
在属性文件中,使用相对路径(相对于classpath(/resources
目录)。
所以我有src/main/resources/sub/file.dat
(应用程序需要的文件),并且在我的属性文件中写着..somewhere.file: "sub/file.dat"
。
在file
属性的设置方法中(在config类中),参数的类型为org.springframework.core.io.Resource
。
public void setFile(Resource path) throws IOException {
this.file = path.getFile();
}
映射/绑定
因此,Spring负责属性(值)中的字符串值与Resource
参数之间的映射。我仔细研究了一下,它使用了自定义的“编辑器”将String转换为Resource。
但是,Resource是一个接口,因此尚不清楚将其映射(绑定)到的实际类。
发生了什么变化?
现在,在Spring Boot 1.5.10.RELEASE中,资源为DefaultResourceLoader$ClassPathContextResource
。
随着Spring Boot 1.5.11.RELEASE的发布,资源变成了ServletContextResource
。
后者对在哪里找到我的资源的看法不同。它认为它们位于src/main/webapp/
中,而不是src/main/resources
中。
因此,我实际上发现了导致无法找到我的文件的错误。
解决方案
我还发现将Resource
更改为ClassPathResource
可以完全解决我的问题。
但是,我仍然不明白为什么用spring-boot的补丁发布(实际上是spring本身)会发生这种情况。这是一个错误吗?
我想我知道使用Resource
作为类型有点冒险,因为它有很多实现。
我在Spring 4.3.15(https://jira.spring.io/secure/ReleaseNote.jspa?projectId=10000&version=16633)的变更日志中找不到任何内容