无法使用相对路径导入Spring bean定义文件

joeg3:

我是Spring新手,继承了一个Spring项目,该项目在ProjectName / WebContent / WEB-INF / applicationContext.xml中具有所有XML配置。我试图将配置分为不同的组件,以便在测试时更容易替换诸如DataSources和Hibernate配置之类的东西。

这是我的文件结构:

ProjectName
  ->WebContent
      ->WEB-INF
          ->applicationContext.xml
          ->spring-datasource.xml
          ->spring-hibernate-properties.xml
          ->spring-persistence.xml
  ->test
      ->us.mn.k12... (Java pkgs with JUnit tests)
      ->spring-hsqldb-datasource.xml
      ->spring-test-bean-locations.xml
      ->spring-test-hibernate-properties.xml
  ->src
      ->us.mn.k12... (Java pkgs with production code)

在WEB-INF / applicationContext.xml中,导入以下内容:

<import resource="spring-datasource.xml"/> <!-- Production datasource -->
<import resource="spring-hibernate-properties.xml"/> <!-- Production hibernate properties -->
<import resource="spring-persistence.xml"/> <!--  DAO's, hibernate .hbm.xml mapping files -->

该应用程序可以使用上述配置。

我的JUnit测试是使用DbUnit和HSQLDB内存数据库运行的。因此,我的JUnit测试引用了spring-test-bean-locations.xml,它具有以下内容:

<import resource="spring-hsqldb-datasource.xml"/> <!-- HSQLDB datasource for test -->
<import resource="../WebContent/WEB-INF/spring-persistence.xml"/>  <!--  Production DAO's, hibernate .hbm.xml mapping files -->
<import resource="spring-test-hibernate-properties.xml"/> <!-- Hibernate properties for test -->

这样,我可以指定测试数据源和休眠属性,但是将生产映射文件重用于DAO等。但是,运行JUnit测试时出现错误。这是例外的相关部分:

Caused by: org.springframework.beans.factory.parsing.BeanDefinitionParsingException: Configuration problem: Failed to import bean definitions from relative location [../WebContent/WEB-INF/spring-persistence.xml]
Offending resource: class path resource [spring-test-bean-locations.xml]; nested exception is org.springframework.beans.factory.BeanDefinitionStoreException: IOException parsing XML document from class path resource [../WebContent/WEB-INF/spring-persistence.xml]; nested exception is java.io.FileNotFoundException: class path resource [../WebContent/WEB-INF/spring-persistence.xml] cannot be opened because it does not exist

现在,如果我将spring-persistence.xml移到/ test中,从而不必使用相对路径,而使用引用它<import resource="spring-persistence.xml"/>,则测试可以正常运行。因此,我认为XML文件的内容还可以,但是我没有正确导入相对路径。

导入相对路径是否有明显的错误?也许更大的问题是,这看起来像是将applicationContext.xml分解为组件以使其更易于测试的合理策略吗?

谢谢!

肖恩·帕特里克·弗洛伊德(Sean Patrick Floyd):

问题是:在常规项目设置中,ClassLoader无法使用WEB-INF中的任何内容(默认情况下,spring使用ClassLoader来访问资源)。有一些可解决此问题的技巧(例如使用file:前缀引用上下文),但是这些技巧大多很难看。

我建议的一种更好的做法是将上下文文件移出WEB-INF并移到专用的资源目录(如果您具有maven设置,则为src / main / resources)。这样,它们将可用于webapp ClassLoader和本地单元测试ClassLoader。

阅读资源一章以进一步了解所涉及的机制。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

TOP 榜单

热门标签

归档