由于属性文件位置类型,应用程序或集成测试Spring上下文创建失败

时间:2018-12-22 15:15:43

标签: java spring tomcat properties

我们的应用程序应使用一个.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

这似乎是“僵局”,因为应用程序或集成测试上下文创建失败。有没有一种方法可以成功创建两个上下文?

1 个答案:

答案 0 :(得分:1)

Spring References Guide中很好地记录了资源加载。如果不为资源加上从其加载的位置的前缀,则默认为ApplicationContext的默认位置。对于将成为存档根目录的Web应用程序,基本上是WEB-INF目录中的内容。 \

您要为此文件加载前缀为file:的文件资源,并在测试中使用classpath:从`classpath中加载它。这样,无论应用程序上下文使用哪个默认位置,它都将起作用。