请问一下各位,我的Action里面老是抱找不到spring的applicationContext.xml的错误,尝试了很多路径,都不行,希望各位帮忙解答一下.
我的Action里面的路径
ApplicationContext context=new FileSystemXmlApplicationContext("src/applicationContext.xml");
包错信息:
javax.servlet.ServletException: org.springframework.beans.factory.BeanDefinitionStoreException: IOException parsing XML document from file [D:\Program Files\apache-tomcat-6.0.7\bin\chinamobile\src\applicationContext.xml]; nested exception is java.io.FileNotFoundException: chinamobile\src\applicationContext.xml (系统找不到指定的路径。)
at org.apache.struts.action.RequestProcessor.processException(RequestProcessor.java:545)
at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:486)
at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:274)
at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1482)
at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:525)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at filter.EncodingFilter.doFilter(EncodingFilter.java:27)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:228)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:212)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:634)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:445)
at java.lang.Thread.run(Thread.java:619)
Caused by: org.springframework.beans.factory.BeanDefinitionStoreException: IOException parsing XML document from file [D:\Program Files\apache-tomcat-6.0.7\bin\chinamobile\src\applicationContext.xml]; nested exception is java.io.FileNotFoundException: chinamobile\src\applicationContext.xml (系统找不到指定的路径。)
at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:180)
at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:148)
at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:129)
at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:145)
at org.springframework.context.support.AbstractXmlApplicationContext.loadBeanDefinitions(AbstractXmlApplicationContext.java:113)
at org.springframework.context.support.AbstractXmlApplicationContext.loadBeanDefinitions(AbstractXmlApplicationContext.java:81)
at org.springframework.context.support.AbstractRefreshableApplicationContext.refreshBeanFactory(AbstractRefreshableApplicationContext.java:89)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:262)
at org.springframework.context.support.FileSystemXmlApplicationContext.<init>(FileSystemXmlApplicationContext.java:89)
at org.springframework.context.support.FileSystemXmlApplicationContext.<init>(FileSystemXmlApplicationContext.java:74)
at org.springframework.context.support.FileSystemXmlApplicationContext.<init>(FileSystemXmlApplicationContext.java:65)
at struts.action.LoginAction.execute(LoginAction.java:53)
at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:484)
... 20 more
Caused by: java.io.FileNotFoundException: chinamobile\src\applicationContext.xml (系统找不到指定的路径。)
at java.io.FileInputStream.open(Native Method)
at java.io.FileInputStream.<init>(FileInputStream.java:106)
at org.springframework.core.io.FileSystemResource.getInputStream(FileSystemResource.java:85)
at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:167)
... 32 more
解决方案:
在web.xml增加如下代码,看看
<context-param>
<param-name> contextConfigLocation </param-name>
<param-value> /WEB-INF/classes/applicationContext.xml </param-value>
</context-param>
<servlet>
<servlet-name> SpringContextServlet </servlet-name>
<servlet-class> org.springframework.web.context.ContextLoaderServlet </servlet-class>
<load-on-startup> 1 </load-on-startup>
</servlet>
-----------------------------
分析:
java.io.FileNotFoundException这个异常信息,遇到的问题及解决方法贴出来可能有以下几种情况:
第一种情况:使用Myeclipse工具创建Spring项目时,按照书上的例子写好程序后,执行时出现该异常。这时需要注意到,Myeclipse默认的把applicationContext.xml文件放在项目的src目录下,而一般我们看到的例子在读取这个文件时使用的语句如下:
ApplicationContext context = new FileSystemXmlApplicationContext("applicationContext.xml");
其实这时这么写就不行了,因为这个语句在查找applicationContext.xml文件时是在项目的根目录下查找,而不会到src目录下查找。这时,应该把语句改为:
ApplicationContext context = new FileSystemXmlApplicationContext("src/applicationContext.xml");
即加上src这个目录,就不会出错了。如果不是使用Myeclipse而是使用eclipse自己导入spring包进行开发,就要先看一下在建项目的时候,是选择把.java文件和.class文件分开放置还是放在同一个目录,如果选择了分开放置则情况和上面的一样(前提条件是applicationContext.xml文件也是自己建在src目录下);如果选择了把.java文件和.class文件放在同一个目录下,这时就要看建applicationContext.xml文件时放在哪个目录下了,如果是放在根目录下,就使用代码1的代码就可以了。如果把applicationContext.xml文件和.java文件放在了同一个目录下,这个时候就要加上程序的包路径了,如我的Java源程序的包名是org.wzhongyu,我就要用下面的语句来实现:
代码3:(注意:这里不能用org.wzhongyu.applicationContext.xml,因为程序会认为org.wzhongyu.也是文件名的内容)
ApplicationContext context = new FileSystemXmlApplicationContext("org/wzhongyu/applicationContext.xml");
第二种情况:使用eclipse+springIDE进行开发,而配置文件使用属性配置文件(即.properties文件),出现异常。这时应该注意,配置文件应该放在CLASSPATH路径下,如果建项目的时候没有选择把.java文件和.class文件分开放置,那么这个.properties文件就应该放在项目的根目录下,这样不会出错。如果建项目的时候,选择了把.java文件和.class文件分别放在src目录和bin目录下,这时一定要注意把.properties文件放在src根目录下,否则就会出错。但是,我们读取这个配置文件的时候,一定不能加上src这个目录,用下面的代码:
BeanDefinitionRegistry reg = new DefaultListableBeanFactory();
PropertiesBeanDefinitionReader reader = new PropertiesBeanDefinitionReader(reg);
reader.loadBeanDefinitions(new ClassPathResource("beans-config.properties"));
这里没有加上src,因为程序执行的CLASSPATH就是在src根目录下,不放在这里就会出错,就是出现java.io.FileNotFoundException这个异常信息。
另外比较好的解决方式就是前面在web.xml指定其位置,这样项目在加载的时候就会知道到哪里去寻找这个配置文件,而且不需要在写什么相对路径,这是比较省事的方式,直接就可以通过这样的方式获取到ApplicationContext 对象。
ApplicationContext context = new FileSystemXmlApplicationContext("applicationContext.xml");