spring-org.springframework.beans.factory.BeanDefinitionStoreException及相关介绍

14 篇文章 0 订阅
7 篇文章 0 订阅

自己做一个测试,要用到Springmvc,因为好久没有配置SpringMvc工程,所以就想自己慢慢试试,真是不试不知道,no zuo no die!!!

启动tomcat后报了下面的错:

严重: Exception sending context initialized event to listener instance of class org.springframework.web.context.ContextLoaderListener
org.springframework.beans.factory.BeanDefinitionStoreException: IOException parsing XML document from ServletContext resource [/WEB-INF/applicationContext.xml]; nested exception is java.io.FileNotFoundException: Could not open ServletContext resource [/WEB-INF/applicationContext.xml]

之前知道spring默认的配置文件是applicationContext.xml,所以如果又重命名要在web.xml中指定。我这里用的是自己重命名过的的mvc.xml配置文件,

我在下面的代码中进行了定义:

<servlet>
<servlet-name>SpringMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:config/mvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
<servlet-name>SpringMVC</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>

可是为什么还会报错?这个问题似乎很严重的样子,以前配置springMvc时没有发现过。

网上:百度了一些方法如:

在web.xml中加入以下配置:

<context-param> 
  <param-name>contextConfigLocation </param-name> 
  <param-value>/WEB-INF/classes/applicationContext.xml </param-value> 
</context-param>

 我把/WEB-INF/classes/applicationContext.xml换成/WEB-INF/classes/config/mvc.xml还是报错。

然后就去/WEB-INF/classes/去找是否生成了mvc.xml文件,一查才发现根本就没有生成,连config文件夹都没有,再去看整个工程时发现原来config文件夹不是在源文件夹src下而是和src并列,导致tomcat启动时根本就知道他的存在。

接着我把config文件夹及其内部文件移到src文件夹中,接着重启tomacat服务器发现还是报错。

严重: Exception sending context initialized event to listener instance of class org.springframework.web.context.ContextLoaderListener
org.springframework.beans.factory.BeanDefinitionStoreException: IOException parsing XML document from ServletContext resource [/WEB-INF/applicationContext.xml]; nested exception is java.io.FileNotFoundException: Could not open ServletContext resource [/WEB-INF/applicationContext.xml]

去/WEB-INF/classes/看,也生成了config/mvc.xml文件,为什么还要去找applicationContext?

tomcat加载spring的配置文件默认位置是在/WEB-INF/下找applicationContext.xml文件,而Myeclipse文件编译后生成的applicationContext配置文件放在/WEB-INF/classes/applicationContext.xml,所以加载时找不到applicationContext.xml文件。

解决方法:

方法1.在web.xml配置文件加上

<context-param> 
  <param-name>contextConfigLocation </param-name> 
  <param-value>/WEB-INF/
classes/config/mvc.xml </param-value> 
</context-param>

其中:<param-value>/WEB-INF/classes/你的spring配置文件路径及配置文件 </param-value> 根据自己的配置文件名定。


方法2:

把你的配置文件如我的是mvc.xml拷贝到WebRoot\WEB-INF\文件夹根目录下,记得如果你的文件名成applicationContext.xml那就没问题,但是如果你的文件名不是applicationContext那么就要改成applicationContext不然还是会报错说找不到applicationContext.xml文件。比如我的mvc.cml就要改成applicationContext.xml后才能启动正常。


我比较推崇第一种方法,第二种方法有点麻烦。

web.xml配置springmvc最简单的配置如下:

  <!-- 配置tomcat加载的spring配置文件的路径 -->
   	<context-param> 
	   <param-name>contextConfigLocation </param-name> 
	   <param-value>/WEB-INF/classes/config/mvc.xml </param-value> 
	</context-param>  
	
	<!-- 加载springmvc -->
	<servlet>
		<servlet-name>SpringMVC</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		 <init-param>
			<param-name>contextConfigLocation</param-name>
			<param-value>classpath:config/mvc.xml</param-value>
		</init-param> 
		<load-on-startup>1</load-on-startup>
	</servlet>
	
	<servlet-mapping>
		<servlet-name>SpringMVC</servlet-name>
		<url-pattern>/</url-pattern>
	</servlet-mapping>
	<!-- 配置spring监听 -->
 	<listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	</listener>

------

上面的问题解决了,于是我又把

<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:config/mvc.xml</param-value>
</init-param>

注释掉,看看有什么错误?

错误如下:

严重: StandardWrapper.Throwable
org.springframework.beans.factory.BeanDefinitionStoreException: IOException parsing XML document from ServletContext resource [/WEB-INF/SpringMVC-servlet.xml]; nested exception is java.io.FileNotFoundException: Could not open ServletContext resource [/WEB-INF/SpringMVC-servlet.xml]

这个错误和上面的错误是不是很相似。

可以得出结论:

一个spring工程,默认的有两个配置文件,一个是我们上面提到的tomcat加载的applicationContext.xml。另一个默认的就是 (你在web.xml写的servlet-name)加上-servlet.xml 比如我的是SpringMVC-servlet.xml。


所以如果我把

<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:config/mvc.xml</param-value>
</init-param>

删除掉,不对配置文件进行初始化。也就是让容器去加载默认的spring配置文件ServletName-servlet.xml,注意默认的ServletName-servlet.xml是在src的根目录下,所以你要注意路径问题不然还是会报找不到ServletName-servlet.xml配置文件。

我下面这种配置springmvc的方法也可以,我的web.xml配置文件就要改成:

 <!-- 配置tomcat加载的spring配置文件的路径 -->
   	<context-param> 
	   <param-name>contextConfigLocation </param-name> 
	   <param-value>/WEB-INF/classes/SpringMVC-servlet.xml </param-value> 
	</context-param>  
	
	<!-- 加载springmvc -->
	<servlet>
		<servlet-name>SpringMVC</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

		<load-on-startup>1</load-on-startup>
	</servlet>
	
	<servlet-mapping>
		<servlet-name>SpringMVC</servlet-name>
		<url-pattern>/</url-pattern>
	</servlet-mapping>
	<!-- 配置spring监听 -->
 	<listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	</listener>

接着我又把

 
<load-on-startup>1</load-on-startup> 



<servlet-mapping>
<servlet-name>SpringMVC</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping> 

也注释掉。虽然启动tomcat后没有报错,但是这样配置后的工程并不好,相关介绍可以看下面链接。


1)load-on-startup元素标记容器是否在启动的时候就加载这个servlet(实例化并调用其init()方法)。

2)它的值必须是一个整数,表示servlet应该被载入的顺序

2)当值为0或者大于0时,表示容器在应用启动时就加载并初始化这个servlet;

3)当值小于0或者没有指定时,则表示容器在该servlet被选择时才会去加载。

4)正数的值越小,该servlet的优先级越高,应用启动时就越先加载。

5)当值相同时,容器就会自己选择顺序来加载。

所以,<load-on-startup>x</load-on-startup>,中x的取值1,2,3,4,5代表的是优先级,而非启动延迟时间。

(http://www.blogjava.net/xzclog/archive/2011/09/29/359789.html)

servlet-mapping 介绍 :-- http://www.blogjava.net/youngturk/archive/2012/05/22/378865.html



  • 5
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值