zoukankan      html  css  js  c++  java
  • “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:javaapache-tomcat-7.0.26webappshost-manager
    17.  
      八月 31, 2015 3:26:26 下午 org.apache.catalina.startup.HostConfig deployDirectory
    18.  
      信息: Deploying web application directory E:javaapache-tomcat-7.0.26webappsmanager
    19.  
      八月 31, 2015 3:26:26 下午 org.apache.catalina.startup.HostConfig deployDirectory
    20.  
      信息: Deploying web application directory E:javaapache-tomcat-7.0.26webappsROOT
    21.  
      八月 31, 2015 3:26:26 下午 org.apache.catalina.startup.HostConfig deployDirectory
    22.  
      信息: Deploying web application directory E:javaapache-tomcat-7.0.26webappszhsz
    23.  
      八月 31, 2015 3:26:26 下午 org.apache.catalina.loader.WebappClassLoader validateJarFile
    24.  
      信息: validateJarFile(E:javaapache-tomcat-7.0.26webappszhszWEB-INFlibjavaee.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。

  • 相关阅读:
    (OnTouchListener) android中的触摸事件的使用(绘图)
    Android开发问题:ActivityNotFoundException: Unable to find explicit activity class
    自定义控件view,并且使用滚动条
    Android中常用的UI控件
    Android中解析XML数据存储
    也许有你的身影
    Android中动态图形的绘制
    治疗失眠十种食疗方
    深入理解iPhone屏幕双缓冲技术
    非苹果PC安装MacOS
  • 原文地址:https://www.cnblogs.com/tinaluo/p/12355929.html
Copyright © 2011-2022 走看看