Spring在存在xml配置文件的情况下找不到bean。

86

我正在尝试制作Spring中的第一个bean,但在加载上下文时遇到问题。 我有一个bean的配置XML文件在src/main/resources中。

我收到以下IOException:

Exception in thread "main" org.springframework.beans.factory.BeanDefinitionStoreException:从类路径资源[src/main/resources/beans.xml]解析XML文档时出现IOException; 嵌套异常是

java.io.FileNotFoundException: 因为不存在,所以无法打开类路径资源[src/main/resources/beans.xml]

但我不理解,因为我执行了以下代码测试:

File f = new File("src/main/resources/beans.xml");
System.out.println("Exist test: " + f.exists());

这让我得到了true! resources 在类路径中。有什么问题吗?


你如何加载上下文? - Aleksandr M
25个回答

1

Gradle : v4.10.3

IDE : IntelliJ

当我使用Gradle运行我的构建和测试时,我遇到了这个问题。将applicationContext.xml复制到各个位置并没有帮助。即使像下面这样指定完整路径也没有帮助!

context = new ClassPathXmlApplicationContext("C:\\...\\applicationContext.xml");

解决方案(至少适用于Gradle)在于Gradle处理资源的方式。对于我的Gradle项目,我按照https://docs.gradle.org/current/userguide/java_plugin.html#sec:java_project_layout定义的工作区布局进行了设置。
当使用默认Gradle任务集运行测试时,会包括“processTestResources”步骤,该步骤查找位于C:\.....\src\test\resources下的测试资源(Gradle提供完整路径非常有帮助)。
您的.properties文件和applicationContext.xml需要在此目录中。如果资源目录不存在(就像我的情况一样),则需要创建它并将文件复制到那里。之后,只需指定文件名即可正常工作。
context = new ClassPathXmlApplicationContext("applicationContext.xml");

1

Beans.xml或file.XML未放置在正确的路径下。如果您有一个Maven项目,应将XML文件添加到资源文件夹下。 src -> main -> java -> resources

注意:请保留HTML标签。


0

我做了与大多数人相反的事情。我正在使用Force IDE Luna Java EE,并将我的Beans.xml文件放在包内;然而,我在ClassPathXMLApplicationContext参数中,在Beans.xml字符串之前加上了相对路径。因此,在我的主应用程序中 - 访问Beans.xml文件的那个 - 我有:

    ApplicationContext context = 
         new ClassPathXmlApplicationContext("com/tutorialspoin/Beans.xml");

我还注意到,当我将Beans.xml文件从src文件夹移动到包中时,XML文件图标的左下角出现了一个Bean图像,而在这个xml文件不在包外面时是没有的。 这是一个很好的指示,让我知道现在beans xml文件可以被ClassPathXMLAppllicationsContext访问。

0

这是对我有效的方法:

  new ClassPathXmlApplicationContext("classpath:beans.xml");

嗨,这对我也起作用,但问题在于当JAR文件构建时,该JAR文件对我不起作用。我的意思是,当我尝试运行JAR文件时,我会收到NoClassDefFoundError,当我在Eclipse中将应用程序作为Java运行时,它可以无错误运行,不确定如何解决这个问题。 - sailaja

0

我不确定要写这个,但也许能帮助某人节省几个小时:

mvn clean

如果您的整个配置已经完美无缺,那么这可能会起作用!


0

我曾经遇到过这个问题,让我很烦恼;最终我在我的 POM.xml 文件中找到了以下代码,那正是问题的原因:

<resources>
    <resource>
        <directory>src/main/resources</directory>
        <filtering>true</filtering>
        <includes>
            <include>**/*.properties</include>
        </includes>
    </resource>
</resources>

0

0
分享我的案例以及我如何调试它,希望能帮助到某些人:
这只有在您首先检查了您实际上是否已经将“资源”文件夹放置在正确的位置并正确命名后才会相关。
创建一个临时文件夹,最好不要在任何 git 项目中(例如 mkdir playground)并移动到此处(cd playground)。 将 Java 存档复制到该位置(例如 cp /path/to/java.war .),该存档缺少 beans.xml。 解压它(例如,在 Ubuntu 上执行 unzip java.war)。 查找其中是否有任何 .xml 文件(例如,在 WEB-INF/classes 中)(解压过程应显示正在解压的文件列表,其中大多数可能是其他依赖项作为存档,这些都不相关)。 如果看不到 beans.xml,请阅读其他 .xml 文件(例如 cat root-config.xml),您可能会在那里找到类似 root-config.xml 的东西。在那里,您可能会发现一些其他的 <import resource="somethingelse.xml"> 记录或没有记录。 如果是这种情况,则意味着您确实拥有该文件(此处为 root-config.xml)存在于项目中,否则继续进入打包存档所在的父项目。找到该文件,添加 <import resource="beans.xml"> 并运行 mvn package

现在通过执行步骤1到5来验证修复,应该会使新打包的存档文件(这里是root-config.xml)中定义有beans.xml,一旦部署,应该就可以工作了。


0
如果您正在使用Eclipse开发,而这个问题仍然困扰着您,请查看这个Eclipse bug:“src/main/resources”中的资源文件没有正确包含在类路径中
解决方案似乎是查看项目属性、Java构建路径、源文件夹。删除/src/main/resources目录,然后再添加它。这会提醒Eclipse需要将这些文件复制到类路径中。
当我使用Eclipse的“Neon”版本时,遇到了这个bug。(直到我意识到刚刚描述的简单解决方法之前,这真的很令人沮丧)

0

我在使用 IntelliJ 时遇到了同样的问题,以下是我解决它的方法:

1. 在 Spring 应用程序类中添加以下资源导入以及其他导入: @ImportResource("applicationContext.xml")

2. 看到 IDE 显示:无法解析文件 'applicationContext.xml',并建议文件期望的路径(它不是最初存放 applicationContext.xml 文件的资源)

3. 将文件复制到期望的位置,异常得到解决。

易于参考的屏幕截图如下: enter image description here

但如果您想将其保留在资源中,则按照下面的良好答案链接,并添加资源路径,以便进行搜索。使用此设置,异常可以解决,而无需执行上述步骤中描述的 @ImportResource:

https://dev59.com/NXRA5IYBdhLWcg3wtwWe#24843914


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接