![]() |
爱热闹的充电器 · springboot2.0配置多数据源出错H ...· 2 月前 · |
![]() |
深情的毛豆 · springboot2.0配置多数据源出错H ...· 2 月前 · |
![]() |
发呆的生姜 · shell中将命令结果赋值给变量_shell ...· 1 年前 · |
![]() |
慷慨的蚂蚁 · [innerHtml]怎么解析出angular换行· 1 年前 · |
![]() |
内向的火柴 · 最新人脸识别库Dlib安装方法!无需CMAK ...· 1 年前 · |
![]() |
光明磊落的猕猴桃 · 平滑滚动到一个元素 - 简书· 1 年前 · |
我正在尝试在Spring中创建我的第一个bean,但在加载上下文时遇到了问题。我在src/main/resources中有一个bean的配置XML文件。
我收到以下IOException:
线程"main“org.springframework.beans.factory.BeanDefinitionStoreException:在解析来自类路径资源src/
/ IOException /beans.xml的XML文档时出现异常;嵌套异常为
java.io.FileNotFoundException:无法打开类路径资源src/main/resources/beans.xml,因为它不存在
但是我不明白,因为我做了下面的代码测试:
File f = new File("src/main/resources/beans.xml");
System.out.println("Exist test: " + f.exists());
这就是事实!
resources
在类路径中。怎么了?
我怀疑您正在构建一个.war/.jar,因此它不再是一个文件,而是该包中的一个资源。请尝试使用 ClassLoader.getResourceAsStream(String path) 。
您已经查看过src目录。xml文件确实存在。但是看看class或bin/build目录,所有的输出类都设置在这里。我怀疑您只需要使用resources/beans.xml路径。
谢谢,但这不是解决办法。我发现了为什么它对我不起作用。
因为我已经做了一个声明:
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
当beans.xml文件在那里时,我想我应该引用项目的根目录。然后,我将配置文件放到src/main/resources,并将初始化更改为:
ApplicationContext context = new ClassPathXmlApplicationContext("src/main/resources/beans.xml");
这仍然是一个IO例外。
然后该文件保留在src/main/resources/中,但我将声明更改为:
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
它解决了问题--也许它会对某些人有帮助。
谢谢和干杯!
编辑:
由于我得到了许多人对这个解决方案的赞许,并且在几年前作为学生就已经有了第一次使用Spring的经验,所以我想简短地解释一下为什么它是有效的。
在编译和打包项目时,项目中“src/main/java”中的所有文件和子目录都会转到打包的jar (我们要创建的工件)的根目录中。同样的规则也适用于'src/main/resources‘。
这是许多工具,如maven或sbt在构建项目过程中遵守的约定(注意:作为默认配置!)。当代码(来自post)处于运行模式时,它找不到类似于"src/main/resources /beans.xml“的任何内容,因为beans.xml位于jar的根目录中(复制到创建的jar/ear/war中的/beans.xml中)。
在使用ClassPathXmlApplicationContext时,beans定义的正确位置声明是"/beans.xml",因为这是它在jar中所属的路径,随后是类路径中的路径。
可以通过使用归档程序(即rar)解压jar并查看其目录结构的内容来验证它。
我建议阅读有关类路径的文章作为补充。
我也有类似的问题,但由于原因有点不同,所以在这里分享一下,以防对任何人都有帮助。
我的文件位置
我是如何使用 的
ClassPathXmlApplicationContext("beans.xml");
有两种解决方案
在使用时,
包名称,即
ClassPathXmlApplicationContext("com/mypackage/beans.xml");
我做了与大多数相反的事情。我使用Force IDE,露娜,Java,并将我的Beans.xml文件放在包中;但是,对于ClassPathXMLApplicationContext参数,我在Beans.xml字符串前面加上了相对路径。因此,在我的主应用程序中-访问Beans.xml文件的应用程序-我有:
ApplicationContext context =
new ClassPathXmlApplicationContext("com/tutorialspoin/Beans.xml");
我还注意到,当我将Beans.xml文件从src文件夹移动到包中时,在XML文件图标的左下角有一个Bean图像,当该文件位于包之外时,该图像并不存在。这是一个很好的指示器,让我知道现在可以通过ClassPathXMLAppllicationsContext访问beans xml文件了。
使用它
ApplicationContext context = new FileSystemXmlApplicationContext("Beans.xml");
这是对我有效的方法:
new ClassPathXmlApplicationContext("classpath:beans.xml");
注意,第一个applicationContext是作为
web.xml
的一部分加载的,下面提到了这一点。
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>META-INF/spring/applicationContext.xml</param-value>
</context-param>
<servlet>
<servlet-name>myOwn-controller</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>META-INF/spring/applicationContext.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
如下所示,代码还将尝试创建一个以上的applicationContext。
private static final ApplicationContext context =
new ClassPathXmlApplicationContext("beans.xml");
请参阅
beans.xml
和
applicationContext.xml
之间的
difference
如果
<META-INF/spring/>
下的
appliationContext.xml
已使用
<import resource="beans.xml"/>
声明,则此
appliationContext.xml
将在
META-INF/spring
的相同位置
appliationContext.xml
下加载
beans.xml
。
其中,as;在代码中;如果声明如下
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
这是在
WEB-INF/classes
或eclipse
src/main/resources
中查看beans.xml。
如果您在
src/main/resources
中添加了
beans.xml
,那么在创建WAR时可能会将其放在
WEB-INF/classes
中。
所以总共查找了两个文件。
我已经解决了这个问题,方法是在
applicationContext.xml
导入时添加类路径查找,如下所示
<import resource="classpath*:beans.xml" />
并删除了java代码中的
ClassPathXmlApplicationContext("beans.xml")
行,这样将只加载一个ApplicationContext。
src/main/resources
是一个源目录,您不应该直接引用它。当您构建/打包项目时,内容将被复制到您的类路径的正确位置。然后,您应该像这样加载它
new ClassPathXmlApplicationContext("beans.xml")
或者像这样
new GenericXmlApplicationContext("classpath:beans.xml");
在Spring中,所有源文件都在src/main/java中。类似地,资源通常保存在src/main/resources中。因此,请将spring配置文件放在resources文件夹中。
确保在src/ ClassPath /resources中也有文件的主条目。
在.classpath中检查以下2行。如果缺少它们,则添加它们。
<classpathentry path="src/main/java" kind="src"/>
<classpathentry path="src/main/resources" kind="src" />
所以,如果你已经准备好了,下面的代码应该可以工作。
新的ClassPathXmlApplicationContext("Spring-Module.xml");= ApplicationContext ctx
如果这个问题仍然困扰着您,并且您正在使用Eclipse进行开发,那么可以看看这个Eclipse bug: Resources files from "src/main/resources" are not correctly included in classpath
解决方案似乎是查看项目属性、Java构建路径、源文件夹。删除
/src/main/resources
目录,然后重新添加。这会导致Eclipse被提醒需要将这些文件复制到类路径。
当我使用Eclipse的"Neon“版本时,这个bug影响了我。(并且非常令人沮丧,直到我意识到刚才描述的简单修复)
这是因为applicationContect.xml或any_filename.XML没有放在正确的路径下。
故障排除步骤
1:在资源文件夹下添加XML文件。
2:如果你没有资源文件夹。通过右键单击项目的new > Source文件夹,将其命名为 资源 ,并将您的XML文件放在它下面来创建一个。
![]() |
爱热闹的充电器 · springboot2.0配置多数据源出错HikariPool-1 - jdbcUrl is required with driverClassName._13405677的技术博客_ 2 月前 |
![]() |
深情的毛豆 · springboot2.0配置多数据源出错HikariPool-1 - jdbcUrl is required with driverClassName._13405677的技术博客_ 2 月前 |
![]() |
慷慨的蚂蚁 · [innerHtml]怎么解析出angular换行 1 年前 |
![]() |
光明磊落的猕猴桃 · 平滑滚动到一个元素 - 简书 1 年前 |