为什么在Spring 4.3.15中更改了属性绑定(类型转换):

时间:2018-07-25 12:29:09

标签: java spring spring-boot properties

我有一个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)的变更日志中找不到任何内容

另请参阅:https://www.logicbig.com/tutorials/spring-framework/spring-boot/custom-configuration-properties-binding.html

1 个答案:

答案 0 :(得分:0)

看来您的问题是由此更改here和此问题here引起的。以前没有使用注册的ProtocolResolvers,但是此提交引起的更改解决了这个问题,因此它似乎会影响您。