我们的应用程序应使用一个.properties
文件,该文件是在部署时在主机文件系统上创建的,因此它在构建时不会与应用程序.war
捆绑在一起。在Spring应用程序上下文创建过程中,它由加载程序类打开和读取
<bean id="propertiesLoader" class="com....PropertiesLoader">
<property name="propertiesFileLocation" value="${PROPERTIES_FILE_LOCATION}"/>
...
其中PROPERTIES_FILE_LOCATION
的文件路径值是在应用程序的application.properties
maven模块的src\main\resources
的{{1}}文件中定义的
-web
,PROPERTIES_FILE_LOCATION=/home/.../propertyfilename.properties
字段的类型为propertiesFileLocation
,可以通过String
类中的new FileInputStream(propertiesFileLocation)
进行访问
通过此设置,应用程序上下文创建成功。但是,我们的项目中也有一些集成测试,这些集成测试也为它们的执行设置了Spring上下文。我们尽管将PropertiesLoader.java
文件的副本存储到propertyfilename.properties
maven模块的src\test\resources
中,并像其一样从-it
引用它,如
it.properties
但是,在创建集成测试上下文期间,我们会收到以下异常
PROPERTIES_FILE_LOCATION=classpath:somedirectory/propertyfilename.properties
现在,如果我们将[ERROR] Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean
with name 'propertiesLoader' defined in URL
[ERROR] Caused by: java.io.FileNotFoundException: classpath:somedirectory\propertyfilename.properties
(The filename, directory name, or volume label syntax is incorrect)
字段的类型修改为propertiesFileLocation
,并通过org.springframework.core.io.Resource
中的propertiesFileLocation.getInputStream()
访问它,那么集成测试上下文创建就成功了,但是同时,真实的应用程序上下文创建失败并显示
PropertiesLoader.java
这似乎是“僵局”,因为应用程序或集成测试上下文创建失败。有没有一种方法可以成功创建两个上下文?
答案 0 :(得分:1)
Spring References Guide中很好地记录了资源加载。如果不为资源加上从其加载的位置的前缀,则默认为ApplicationContext
的默认位置。对于将成为存档根目录的Web应用程序,基本上是WEB-INF
目录中的内容。 \
您要为此文件加载前缀为file:
的文件资源,并在测试中使用classpath:
从`classpath中加载它。这样,无论应用程序上下文使用哪个默认位置,它都将起作用。