关于SpringMVC项目报错:java.io.FileNotFoundException: Could not open ServletContext resource [/WEB-INF/xxxx.xml]

关于 SpringMVC 项目报错:java.io.FileNotFoundException: Could not open ServletContext resource [/WEB-INF/xxxx.xml]

问题描述:

在搭建 SpringMVC 项目时, 使用多个 Spring 配置文件, 这里我在web.xml中配置 spring 的配置文件:

<servlet>
    <servlet-name>spring</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath*:spring/spring-mvc.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>spring</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

然后再 spring-mvc.xml 配置文件中又使用<import>标签导入其他的配置文件:applicationContext.xml, 导入代码如下:

<import resource="./applicationContext.xml"/>

其中我将两个 spring 配置文件都放在resources下的spring文件夹下, 文件结构如下:

|---resources
   |---spring
      |---spring-mvc.xml
      |---applicationContext.xml

此时在项目执行时报错:

java.io.FileNotFoundException: Could not open ServletContext resource [/WEB-INF/applicationContext.xml]

解决办法

看到这个错误, 我是不相信的, 我检查了我的 spring-mvc.xml 文件, 确定我使用是相对路径, 并没有什么问题, 于是到网上查资料, 说使用 spring 配置文件路径填写的不对, 推荐使用:classpath:或者classpath*:, 分别使用这两种方式在<import>中改写applicationContext.xml的路径, 可以是依然报FileNotFoundException, 我十分确定我填写的路径没有问题, 但是一直报错就十分奇怪, 我观察报错的路径:

Could not open ServletContext resource [/WEB-INF/applicationContext.xml]

项目在运行是是直接去WEB-INFapplicationContext.xml文件, 我查看项目运行时target文件夹, 找到这是applicationContext.xml配置文件在:

/WEB-INF/classes/spring/applicationContext.xml

下, 于是我将applicationContext.xml放到WEB-INF下在执行, 发现没有的报错了, 说明项目在运行时<import>根本没有起到应有的作用, 系统依然走的是默认到WEB-INF目录下找的配置文件, 这显然不是我要的效果, 就在我最抓狂的时候, 我发现我的web.xml少了几行配置:

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath*:spring/spring-mvc.xml</param-value>
</context-param>

抱着试一试的想法, 我将这一行配置加上, 运行项目后顺利运行
......
......
......
(╯‵□′)╯︵┻━┻

总结

经过这一次的教训, 发现做事的时候还是不够细心, 这里我在晚上寻找解决办法是有关这个问题需要注意的地方列一下:

  • 经过多方资料的对比, 在设置 spring 配置文件时, 建议使用classpath而不是classpath* 貌似会因为这个问题报错, 我暂时没有遇到过
  • 在配置文件wen.xml中使用<context-param>配置contextConfigLocation变量, 我就是犯了这个错误
  • 配置文件名一定要写写对, 这种属于最低级也是最容易忽略的错误

另外如果有什么其他问题, 或者错误的地方, 希望大家提出宝贵的意见, 谢谢

参考资料

http://blog.csdn.net/lee0723/article/details/18223749
http://perfy315.iteye.com/blog/2009258
http://blog.csdn.net/zwx_20092029/article/details/39229971