gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:04:17 24 4
gpt4 key购买 nike

我是 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 -->

通过这种方式,我可以指定测试数据源和 hibernate 属性,但可以为 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 分解为组件以使其更易于测试的合理策略吗?

谢谢!

最佳答案

问题是:在常规项目设置中,WEB-INF 中的任何内容都不可用于 ClassLoader(并且 spring 默认使用 ClassLoader 来访问资源)。有一些 hack 可以解决这个问题(比如使用 file: 前缀引用上下文),但这些大多很难看。

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

阅读resources chapter进一步了解所涉及的机制。

关于java - 无法使用相对路径导入 Spring bean 定义文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8596346/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com