![](/img/trans.png)
[英]Why does FileOutputStream throw FileNotFoundException?
[英]Why does Spring's PropertySource throw a FileNotFoundException?
我正在尝试使用Spring加载属性文件,该文件位于我的WEB-INF
文件夹中。
我收到以下错误:
org.springframework.beans.factory.BeanDefinitionStoreException:无法解析配置类[com.elastictest.config.ProdConfig]; 嵌套的异常是java.io.FileNotFoundException:\\ WEB-INF \\ config \\ prod.properties(系统找不到指定的路径)
这是我的生产配置文件:
@Configuration
@Profile("prod")
@PropertySource("file:${prodPropertiesFile}")
public class ProdConfig {
@Bean
public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() {
return new PropertySourcesPlaceholderConfigurer();
}
}
这是我的web.xml声明:
<context-param>
<param-name>prodPropertiesFile</param-name>
<param-value>/WEB-INF/config/prod.properties</param-value>
</context-param>
我已经打了仗,并确认属性文件在WEB-INF / config文件夹下。 有任何想法吗?
您在@PropertySource
批注中指定的位置由ResourceLoader
处理。 在这种情况下,这将是AnnotationConfigWebApplicationContext
,因为这是一个Web应用程序,并且您要使用注释配置。
作为ResourceLoader
实现, AnnotationConfigWebApplicationContext
知道如何解析位置值以查找和初始化Resource
对象。 它使用这些来创建用于属性解析的ResourcePropertySource
对象。
位置值解析遵循以下几个步骤:
/
开头,则将其解释为Servlet上下文资源,Spring尝试通过ServletContext#getResourceAsStream
检索它。 classpath:
开头,则将其解释为类路径资源,Spring会在给定适当的ClassLoader
的情况下尝试通过ClassLoader#getResourceAsStream
检索它。 否则,它会将解析推迟到使用URL
定位资源的UrlResource
。 它的javadoc状态
作为支持分辨率
URL
,也可以作为File
中的情况下,"file:"
协议。
在您的情况下,您在位置加上file:
前缀file:
因此Spring尝试使用UrlResource
。 您的路径前面有一个/
,文件系统会将其视为绝对路径的开始。 您在该位置显然没有文件/WEB-INF/config/prod.properties
。
如果您按照本答案中的建议使用classpath:
前缀,则必须确保/WEB-INF/config/prod.properties
位于类路径上。 放在类路径上是很不常见的事情,因此我不建议这样做。
最后,如您所知,您可以使用
@PropertySource("/WEB-INF/config/prod.properties")
// or to support your property
@PropertySource("${prodPropertiesFile}")
它将尝试通过ServletContext
检索资源。 它的javadoc状态
该路径必须以
/
开头,并被解释为相对于当前上下文根
您的WEB-INF
文件夹将位于上下文根(基本上是为Servlet容器选择的目录,作为您的Web应用程序的根目录),因此将找到并使用该资源。
您可以在此处的官方文档中了解更多关于Resource
的信息, 在此处可了解关于ResourceLoader
流程的更多信息 。
无需web.xml声明。 这样尝试
@PropertySource(name="prodPropertiesFile", value="classpath:/WEB-INF/config/prod.properties")
public class ProdConfig {
}
事实证明,这比我做的要简单:
@PropertySource("/WEB-INF/config/prod.properties")
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.