繁体   English   中英

为什么Spring的PropertySource抛出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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM