您的位置:首页 > 移动开发

java.io.FileNotFoundException: class path resource [spring/ApplicationCont.xml] cannot be opened be

2017-08-04 20:53 1036 查看
问题说明:

新建一个Spring项目,新建一个Bean类:HelloWorld类,Main.java是主程序,xml是Spring配置文件。

项目结构如下:



 

打开文件夹,src目录下的结构如下: 



 

打开bin文件夹,目录如下



 

HelloWorld.java代码:



1 package com.tt.spring.beans;
2
3 public class HelloWorld {
4
5     private String name;
6
7     public void setName(String name) {
8         this.name = name;
9     }
10
11     public void hello(){
12         System.out.println("hello: "+name);
13     }
14
15 }




Main.java



1 package com.tt.spring.beans;
2
3 import org.springframework.context.ApplicationContext;
4 import org.springframework.context.support.ClassPathXmlApplicationContext;
5
6 public class Main {
7
8     public static void main(String[] args){
9         /*
10         //创建HelloWorld的一个对象
11         HelloWorld helloWorld = new HelloWorld();
12         //为name属性赋值
13         helloWorld.setName("tt");
14         */
15         //调用hello方法
16
17         //1.创建Spring 的 IOC 容器对象
18         ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
19
20         //2.从IOC容器中获取Bean实例
21         HelloWorld helloWorld = (HelloWorld) ctx.getBean("helloWorld");
22
23         //3.调用Hello方法
24         helloWorld.hello();
25
26     }
27 }




applicationContext.xml:



1 <?xml version="1.0" encoding="UTF-8"?>
2 <beans xmlns="http://www.springframework.org/schema/beans"
3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> 5
6     <!-- 配置bean -->
7     <bean id="helloWorld" class="com.tt.spring.beans.HelloWorld">
8          <property name="name" value="Spring"></property>
9     </bean>
10 </beans>




运行Main.java程序,结果显示报错。报错如下:

信息: Loading XML bean definitions from class path resource [applicationContext.xml]
Exception in thread "main" org.springframework.beans.factory.BeanDefinitionStoreException: IOException parsing XML document from class path resource [applicationContext.xml]; nested exception is java.io.FileNotFoundException:
class path resource [applicationContext.xml] cannot be opened because it does not exist

at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:343)

at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:303)

at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:180)

at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:216)

at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:187)

at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:251)

at org.springframework.context.support.AbstractXmlApplicationContext.loadBeanDefinitions(AbstractXmlApplicationContext.java:127)

at org.springframework.context.support.AbstractXmlApplicationContext.loadBeanDefinitions(AbstractXmlApplicationContext.java:93)

at org.springframework.context.support.AbstractRefreshableApplicationContext.refreshBeanFactory(AbstractRefreshableApplicationContext.java:129)

at org.springframework.context.support.AbstractApplicationContext.obtainFreshBeanFactory(AbstractApplicationContext.java:540)

at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:454)

at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:139)

at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:83)

at com.tt.spring.beans.Main.main(Main.java:18)
Caused by: java.io.FileNotFoundException: class path resource [applicationContext.xml] cannot be opened because it does not exist
at org.springframework.core.io.ClassPathResource.getInputStream(ClassPathResource.java:158)
at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:329)
... 13 more

 

 

问题分析:

个人的文件目录树大概这样:

 

SpringDemo根目录

   --src java源文件

   --WEB-INF

        --web.xml

        --applicationContext.xml

        --classes文件夹

           --com包

              --java编译后的class文件

   --index.jsp

 

根据网上查找的解决办法,我把applicationContext.xml从bin的com层的最里面复制出来放到classess文件夹即bin文件夹中(不能放到com中,应为xml中class路径),该问题解决了。



现在目录树如下:

 

   --src java源文件
   --WEB-INF
         --web.xml
         --classes文件夹
             --applicationContext.xml
             --com包
                  --java编译后的class文件
   --index.jsp
 
但是,当新建另一个Bean:Car类时,问题马上来了!!!!!!!



1  1 package com.tt.spring.beans;
2  2
3  3 public class Car {
4  4
5  5     private String brand;
6  6     private String corp;
7  7     private int price;
8  8     private int maxSpeed;
9  9
10 10
11 11     public Car() {
12 12         System.out.println("Car's Constructor");
13 13     }
14 14
15 15     public Car(String brand, String corp, int price) {
16 16         super();
17 17         this.brand = brand;
18 18         this.corp = corp;
19 19         this.price = price;
20 20     }
21 21
22 22     @Override
23 23     public String toString() {
24 24         return "Car [brand=" + brand + ", corp=" + corp + ", price=" + price + ", maxSpeed=" + maxSpeed + "]";
25 25     }
26 26
27 27 }




applicationContext.xml



1 <?xml version="1.0" encoding="UTF-8"?>
2 <beans xmlns="http://www.springframework.org/schema/beans"
3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4     xsi:schemaLocation="http://www.springframework.org/schema/beans
5                         http://www.springframework.org/schema/beans/spring-beans.xsd"> 6
7    <context:component-scan base-package="com.tt.spring.beans"></context:component-scan>
8     <!--
9                      配置bean
10         class:bean的全类名,通过反射的方式在IOC容器中创建Bean实例,所以要求Bean中必须有无参的构造器
11         id:标识容器中的bean,id唯一
12     -->
13     <bean id="helloWorld" class="com.tt.spring.beans.HelloWorld">
14          <property name="name" value="Spring"></property>
15     </bean>
16
17     <!-- 通过构造方法来配置bean的属性 -->
18     <bean id="car" class="com.tt.spring.beans.Car">
19          <constructor-arg value="Audi"></constructor-arg>
20          <constructor-arg value="chengdu"></constructor-arg>
21          <constructor-arg value="30000"></constructor-arg>
22     </bean>
23
24 </beans>




Main.java



 
控制台打印信息如下:
 



 
看到没?只能获取一个bean实例,不能获取两个。
原因分析:
在项目里,applicationContext.xml是在src最里面一层的,不在src的那一层,所以一旦运行Main.java文件,相应的就会在bin的目录下生成对应的applicationContext.xml文件。



但是我们又在bin文件夹里做过粘贴applicationContext.xml。
 


所以说applicationContext.xml的目录压根就是混乱的!!!既是处于根目录,又处于com最里面的目录。
要么在项目上将xml移到src那一层,那么bin底下的xml也对应着-------xml就处于根目录。
要么在项目上仍然位于com的最里面,那么bin那里就不要将xml移出来----xml就处于最里面的目录
至于xml文件究竟在哪个目录,就该用相应的读取方式。
 
ClassPathXmlApplicationContext和FileSystemXmlApplicationContext读取xml

 
 ApplicationContext applicationContext = new FileSystemXmlApplicationContext("WEB-INF/classes/applicationContext.xml"); 

 ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml") 
 

 现在这个项目是使用ClassPathXmlApplicationContext读取xml文件的,就把配置文件applicationContext.xml放到src的那一层。



 

如果使用FileSystemXmlApplicationContext读取,则需把配置文件放到整个项目的根目录。

原地址:http://www.cnblogs.com/TTTTT/p/6387036.html,感谢作者。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐