【发布时间】:2019-01-02 06:36:11
【问题描述】:
我有一个使用文件的 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 类型。
在属性文件中,我使用相对路径(相对于类路径(/resources 目录))。
所以我有src/main/resources/sub/file.dat(应用程序需要的文件),在我的属性文件中写着..somewhere.file: "sub/file.dat"。
在file 属性的设置器中(在配置类中),参数的类型为org.springframework.core.io.Resource。
public void setFile(Resource path) throws IOException {
this.file = path.getFile();
}
映射/绑定
因此,Spring 负责属性(值)中的字符串值与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 本身)。是bug吗??
我想我理解使用Resource 作为类型有点冒险,因为它有很多实现。
我在 spring 4.3.15 的更新日志中找不到任何内容 (https://jira.spring.io/secure/ReleaseNote.jspa?projectId=10000&version=16633)
【问题讨论】:
-
你是如何运行你的 Spring Boot 应用程序的?作为部署的 WAR 还是独立的 JAR?但我猜这是 Spring Boot 中this change 的结果。这实际上使它按照 Spring 的资源加载规则应有的工作方式工作。 (对于
WebApplicationContext,根路径是 Web 应用程序的根,而不是类路径的根)。因此,您实际上应该在属性文件中拥有的是classpath:sub/file.dat,而不是您现在拥有的。 -
谢谢@M.Deinum。是的,我有一个战争。感谢类路径的想法。
标签: java spring spring-boot properties