“Could not open ServletContext resource [/WEB-INF/applicationContext.xml]”解決方案


問題表現:

如果不解決問題,將無法正常訪問項目

  1.  
    HTTP Status 404 – Not Found
  2.  
     
  3.  
    Type Status Report
  4.  
     
  5.  
    Message /ssmtest/
  6.  
     
  7.  
    Description The origin server did not find a current representation for the target resource or is not willing to disclose that one exists.
  8.  
    Apache Tomcat/8.5.34

問題描述:

最近學了Maven,並嘗試將以前的項目(springmvc+myabtis)重構成Maven項目,Maven項目推薦各種資源文件都放在src/java/resources目錄下,所以我自然把spring的配置文件(包括spring-mvc,spring-mybatis等配置都寫在一個文件中)applicationContext.xml文件也放在了resources目錄下,重構結束后,啟動Tomcat報錯:

  1.  
    八月 31, 2015 3:26:24 下午 org.apache.catalina.core.AprLifecycleListener init
  2.  
    信息: Loaded APR based Apache Tomcat Native library 1.1.22.
  3.  
    八月 31, 2015 3:26:24 下午 org.apache.catalina.core.AprLifecycleListener init
  4.  
    信息: APR capabilities: IPv6 [false], sendfile [true], accept filters [false], random [true].
  5.  
    八月 31, 2015 3:26:25 下午 org.apache.coyote.AbstractProtocol init
  6.  
    信息: Initializing ProtocolHandler ["http-apr-8080"]
  7.  
    八月 31, 2015 3:26:25 下午 org.apache.coyote.AbstractProtocol init
  8.  
    信息: Initializing ProtocolHandler ["ajp-apr-8009"]
  9.  
    八月 31, 2015 3:26:25 下午 org.apache.catalina.startup.Catalina load
  10.  
    信息: Initialization processed in 1784 ms
  11.  
    八月 31, 2015 3:26:25 下午 org.apache.catalina.core.StandardService startInternal
  12.  
    信息: Starting service Catalina
  13.  
    八月 31, 2015 3:26:25 下午 org.apache.catalina.core.StandardEngine startInternal
  14.  
    信息: Starting Servlet Engine: Apache Tomcat/7.0.26
  15.  
    八月 31, 2015 3:26:25 下午 org.apache.catalina.startup.HostConfig deployDirectory
  16.  
    信息: Deploying web application directory E:\java\apache-tomcat-7.0.26\webapps\host-manager
  17.  
    八月 31, 2015 3:26:26 下午 org.apache.catalina.startup.HostConfig deployDirectory
  18.  
    信息: Deploying web application directory E:\java\apache-tomcat-7.0.26\webapps\manager
  19.  
    八月 31, 2015 3:26:26 下午 org.apache.catalina.startup.HostConfig deployDirectory
  20.  
    信息: Deploying web application directory E:\java\apache-tomcat-7.0.26\webapps\ROOT
  21.  
    八月 31, 2015 3:26:26 下午 org.apache.catalina.startup.HostConfig deployDirectory
  22.  
    信息: Deploying web application directory E:\java\apache-tomcat-7.0.26\webapps\zhsz
  23.  
    八月 31, 2015 3:26:26 下午 org.apache.catalina.loader.WebappClassLoader validateJarFile
  24.  
    信息: validateJarFile(E:\ java\apache-tomcat-7.0.26\webapps\zhsz\WEB-INF\lib\javaee.jar) - jar not loaded. See Servlet Spec 2.3, section 9.7.2. Offending class: javax/servlet/Servlet.class
  25.  
    八月 31, 2015 3:26:32 下午 org.apache.catalina.core.ApplicationContext log
  26.  
    信息: No Spring WebApplicationInitializer types detected on classpath
  27.  
    log4j: ERROR Could not find value for key log4j.appender.stdout
  28.  
    log4j: ERROR Could not instantiate appender named "stdout".
  29.  
    log4j: ERROR Could not find value for key log4j.appender.debug
  30.  
    log4j: ERROR Could not instantiate appender named "debug".
  31.  
    八月 31, 2015 3:26:32 下午 org.apache.catalina.core.ApplicationContext log
  32.  
    信息: Initializing Spring root WebApplicationContext
  33.  
    八月 31, 2015 3:26:33 下午 org.apache.catalina.core.StandardContext listenerStart
  34.  
    嚴重: Exception sending context initialized event to listener instance of class org.springframework.web.context.ContextLoaderListener
  35.  
    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]
  36.  
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:341)
  37.  
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:302)
  38.  
    at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:174)
  39.  
    at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:209)
  40.  
    at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:180)
  41.  
    at org.springframework.web.context.support.XmlWebApplicationContext.loadBeanDefinitions(XmlWebApplicationContext.java:125)
  42.  
    at org.springframework.web.context.support.XmlWebApplicationContext.loadBeanDefinitions(XmlWebApplicationContext.java:94)
  43.  
    at org.springframework.context.support.AbstractRefreshableApplicationContext.refreshBeanFactory(AbstractRefreshableApplicationContext.java:131)
  44.  
    at org.springframework.context.support.AbstractApplicationContext.obtainFreshBeanFactory(AbstractApplicationContext.java:522)
  45.  
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:436)
  46.  
    at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:385)
  47.  
    at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:284)
  48.  
    at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:111)
  49.  
    at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4779)
  50.  
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5273)
  51.  
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
  52.  
    at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:895)
  53.  
    at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:871)
  54.  
    at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:615)
  55.  
    at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:1095)
  56.  
    at org.apache.catalina.startup.HostConfig$DeployDirectory.run(HostConfig.java:1617)
  57.  
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
  58.  
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)
  59.  
    at java.util.concurrent.FutureTask.run(FutureTask.java:166)
  60.  
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
  61.  
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
  62.  
    at java.lang.Thread.run(Thread.java:722)
  63.  
    Caused by: java.io.FileNotFoundException: Could not open ServletContext resource [/WEB-INF/applicationContext.xml]
  64.  
    at org.springframework.web.context.support.ServletContextResource.getInputStream(ServletContextResource.java:140)
  65.  
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:328)
  66.  
    ... 26 more
  67.  
    八月 31, 2015 3:26:33 下午 org.apache.catalina.core.StandardContext startInternal
  68.  
    嚴重: Error listenerStart
  69.  
    八月 31, 2015 3:26:33 下午 org.apache.catalina.core.StandardContext startInternal
  70.  
    嚴重: Context [/zhsz] startup failed due to previous errors
  71.  
    八月 31, 2015 3:26:33 下午 org.apache.catalina.core.ApplicationContext log
  72.  
    信息: Closing Spring root WebApplicationContext
  73.  
    八月 31, 2015 3:26:33 下午 org.apache.catalina.core.StandardContext listenerStop
  74.  
    嚴重: Exception sending context destroyed event to listener instance of class org.springframework.web.context.ContextLoaderListener
  75.  
    java.lang.IllegalStateException: BeanFactory not initialized or already closed - call 'refresh' before accessing beans via the ApplicationContext
  76.  
    at org.springframework.context.support.AbstractRefreshableApplicationContext.getBeanFactory(AbstractRefreshableApplicationContext.java:172)
  77.  
    at org.springframework.context.support.AbstractApplicationContext.destroyBeans(AbstractApplicationContext.java:1066)
  78.  
    at org.springframework.context.support.AbstractApplicationContext.doClose(AbstractApplicationContext.java:1040)
  79.  
    at org.springframework.context.support.AbstractApplicationContext.close(AbstractApplicationContext.java:988)
  80.  
    at org.springframework.web.context.ContextLoader.closeWebApplicationContext(ContextLoader.java:556)
  81.  
    at org.springframework.web.context.ContextLoaderListener.contextDestroyed(ContextLoaderListener.java:142)
  82.  
    at org.apache.catalina.core.StandardContext.listenerStop(StandardContext.java:4819)
  83.  
    at org.apache.catalina.core.StandardContext.stopInternal(StandardContext.java:5466)
  84.  
    at org.apache.catalina.util.LifecycleBase.stop(LifecycleBase.java:232)
  85.  
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:160)
  86.  
    at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:895)
  87.  
    at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:871)
  88.  
    at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:615)
  89.  
    at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:1095)
  90.  
    at org.apache.catalina.startup.HostConfig$DeployDirectory.run(HostConfig.java:1617)
  91.  
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
  92.  
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)
  93.  
    at java.util.concurrent.FutureTask.run(FutureTask.java:166)
  94.  
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
  95.  
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
  96.  
    at java.lang.Thread.run(Thread.java:722)
  97.  
    八月 31, 2015 3:26:33 下午 org.apache.coyote.AbstractProtocol start
  98.  
    信息: Starting ProtocolHandler ["http-apr-8080"]
  99.  
    八月 31, 2015 3:26:33 下午 org.apache.coyote.AbstractProtocol start
  100.  
    信息: Starting ProtocolHandler ["ajp-apr-8009"]
  101.  
    八月 31, 2015 3:26:33 下午 org.apache.catalina.startup.Catalina start
  102.  
    信息: Server startup in 7589 ms

注意一下,其實重點就一句話,即Could not open ServletContext resource [/WEB-INF/applicationContext.xml],異常也很明顯,FileNotException,無法打開ServletContext的資源文件。下面再看一下web.xml的配置:
 

  1.  
    <?xml version="1.0" encoding="UTF-8"?>
  2.  
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3.  
    xmlns="http://java.sun.com/xml/ns/javaee"
  4.  
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
  5.  
    http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
  6.  
    id="WebApp_ID" version="3.0">
  7.  
    <display-name>xxybm</display-name>
  8.  
     
  9.  
    <listener>
  10.  
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  11.  
    </listener>
  12.  
     
  13.  
    <servlet>
  14.  
    <servlet-name>springMvc</servlet-name>
  15.  
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  16.  
    <init-param>
  17.  
    <param-name>contextConfigLocation</param-name>
  18.  
    <param-value>classpath:applicationContext.xml</param-value>
  19.  
    </init-param>
  20.  
    <load-on-startup>2</load-on-startup>
  21.  
    </servlet>
  22.  
     
  23.  
    <servlet-mapping>
  24.  
    <servlet-name>springMvc</servlet-name>
  25.  
    <url-pattern>/app/*</url-pattern>
  26.  
    </servlet-mapping>
  27.  
     
  28.  
     
  29.  
    <filter>
  30.  
    <filter-name>SecurityFilter</filter-name>
  31.  
    <filter-class>net.zhsz.util.LoginCheckFilter</filter-class>
  32.  
    </filter>
  33.  
    <filter-mapping>
  34.  
    <filter-name>SecurityFilter</filter-name>
  35.  
    <url-pattern>*.jsp</url-pattern>
  36.  
    </filter-mapping>
  37.  
    <filter-mapping>
  38.  
    <filter-name>SecurityFilter</filter-name>
  39.  
    <url-pattern>/app/*</url-pattern>
  40.  
    </filter-mapping>
  41.  
     
  42.  
     
  43.  
    <session-config>
  44.  
    <session-timeout>30</session-timeout>
  45.  
    </session-config>
  46.  
     
  47.  
     
  48.  
    <error-page>
  49.  
    <exception-type>java.lang.Exception</exception-type>
  50.  
    <location>/500.html</location>
  51.  
    </error-page>
  52.  
     
  53.  
    </web-app>

由於在沒用Maven之前,我的spring配置文件——applicationContext.xml是放在WEB-INF根目錄下的,在項目運行時都是正常的,重構成Maven項目之后,我的配置文件自然應該放在src下的resources文件夾下了,那么在web.xml中我自然將<init-param>中contextConfigLocation的參數值由WEB-INF/applicationContext.xml修改為classpath:applicationContext.xml了,那么啟動tomcat之后依然報錯,而且我們從報錯信息中可以看出容器依然是在WEB-INF下去找applicationContext.xml,很明顯這個文件的位置已經被我們改變了,而且我們也修改了web.xml的配置為何還要從這里去加載呢?原因是我們缺少另一個重要的配置。

解決辦法:

遇到問題盲目搜索往往不能迅速得到有效的解決方案,所以我們先從官方去尋找線索,看一看spring的官方文檔,在The Web的章節中可以發現這樣一段話:

 

簡單翻譯一下上圖標記的小段落:如果不特意指定參數名為contextConfigLoction的<context-parameter>元素,那么spring的ContextLoderListener監聽器就會在/WEB-INF/下去尋找並加載該目錄下的名為applicationContext.xml這個文件。So,我們應該在web.xml中添加<context-param>標簽並再次指定spring核心文件的位置
 

  1.  
    <context-param>
  2.  
    <param-name>contextConfigLocation</param-name>
  3.  
    <param-value>classpath:applicationContext.xml</param-value>
  4.  
    </context-param>

這樣就OK了,注意這段配置盡量寫在靠前的位置,因為在tomcat啟動后web項目會先初始化上下文,我們這段配置正是指定了上下文配置的文件位置,在上下文初始化完成之后才應當繼續加載其余各種配置,而我們的springMVC的servlet僅僅是springMVC框架的相關配置,就好比struts2的配置一樣,項目整體還是由spring去管理的。下面是修改之后的web.xml配置文件:

  1.  
    <?xml version="1.0" encoding="UTF-8"?>
  2.  
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3.  
    xmlns="http://java.sun.com/xml/ns/javaee"
  4.  
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
  5.  
    http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
  6.  
    id="WebApp_ID" version="3.0">
  7.  
    <display-name>xxybm</display-name>
  8.  
     
  9.  
    <context-param>
  10.  
    <param-name>contextConfigLocation</param-name>
  11.  
    <param-value>classpath:applicationContext.xml</param-value>
  12.  
    </context-param>
  13.  
     
  14.  
    <listener>
  15.  
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  16.  
    </listener>
  17.  
     
  18.  
    <servlet>
  19.  
    <servlet-name>springMvc</servlet-name>
  20.  
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  21.  
    <init-param>
  22.  
    <param-name>contextConfigLocation</param-name>
  23.  
    <param-value>classpath:applicationContext.xml</param-value>
  24.  
    </init-param>
  25.  
    <load-on-startup>2</load-on-startup>
  26.  
    </servlet>
  27.  
     
  28.  
    <servlet-mapping>
  29.  
    <servlet-name>springMvc</servlet-name>
  30.  
    <url-pattern>/app/*</url-pattern>
  31.  
    </servlet-mapping>
  32.  
     
  33.  
    <filter>
  34.  
    <filter-name>SecurityFilter</filter-name>
  35.  
    <filter-class>net.zhsz.util.LoginCheckFilter</filter-class>
  36.  
    </filter>
  37.  
     
  38.  
    <filter-mapping>
  39.  
    <filter-name>SecurityFilter</filter-name>
  40.  
    <url-pattern>*.jsp</url-pattern>
  41.  
    </filter-mapping>
  42.  
     
  43.  
    <filter-mapping>
  44.  
    <filter-name>SecurityFilter</filter-name>
  45.  
    <url-pattern>/app/*</url-pattern>
  46.  
    </filter-mapping>
  47.  
     
  48.  
    <session-config>
  49.  
    <session-timeout>30</session-timeout>
  50.  
    </session-config>
  51.  
     
  52.  
    <error-page>
  53.  
    <exception-type>java.lang.Exception</exception-type>
  54.  
    <location>/500.html</location>
  55.  
    </error-page>
  56.  
    </web-app>

 最后再次啟動項目,運行正常,spring和springMVC均正常加載並初始化。之前在網上查的有人說修改路徑,加星號,又是少jar包,答案千奇百怪,然后都無法解決問題,總之這篇blog希望能對遇到這個異常的朋友有所幫助,The End。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM