【问题标题】:nested exception is java.io.FileNotFoundException: Could not open ServletContext resource [/spring/servlet-context.xml]嵌套异常是 java.io.FileNotFoundException: 无法打开 ServletContext 资源 [/spring/servlet-context.xml]
【发布时间】:2013-10-24 12:33:50
【问题描述】:

好的,感谢您帮助解答最后一个问题。这是我的新错误和后面的代码。错误中的粗体文本是我唯一关心的问题,因为这是唯一的错误。

[Thread-36] ContextLoader ERROR 上下文初始化失败 org.springframework.beans.factory.BeanDefinitionStoreException:IOException 从 ServletContext 资源解析 XML 文档 [/spring/servlet-context.xml];嵌套异常是 java.io.FileNotFoundException: 无法打开 ServletContext 资源 [/spring/servlet-context.xml] 在 org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:341) 在 org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:302) 在 org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:143) 在 org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:178) 在 org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:149) 在 org.springframework.web.context.support.XmlWebApplicationContext.loadBeanDefinitions(XmlWebApplicationContext.java:124) 在 org.springframework.web.context.support.XmlWebApplicationContext.loadBeanDefinitions(XmlWebApplicationContext.java:93) 在 org.springframework.context.support.AbstractRefreshableApplicationContext.refreshBeanFactory(AbstractRefreshableApplicationContext.java:130) 在 org.springframework.context.support.AbstractApplicationContext.obtainFreshBeanFactory(AbstractApplicationContext.java:467) 在 org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:397) 在 org.springframework.web.context.ContextLoader.createWebApplicationContext(ContextLoader.java:276) 在 org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:197) 在 org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:47) 在 org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4701) 在 org.apache.catalina.core.StandardContext$1.call(StandardContext.java:5204) 在 org.apache.catalina.core.StandardContext$1.call(StandardContext.java:5199) 在 java.util.concurrent.FutureTask.run(未知来源) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(未知来源) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(未知来源) 在 java.lang.Thread.run(未知来源) 原因:java.io.FileNotFoundException:无法打开 ServletContext 资源 [/spring/servlet-context.xml] 在 org.springframework.web.context.support.ServletContextResource.getInputStream(ServletContextResource.java:117) 在 org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:328) ... 19 更多 2013 年 10 月 16 日上午 7:44:51 org.apache.catalina.core.StandardContext startInternal 严重:错误 listenerStart 2013 年 10 月 16 日上午 7:44:51 org.apache.catalina.core.StandardContext startInternal 严重:上下文 [/mdimgmtsys-1.0-SNAPSHOT] 由于先前的错误,启动失败

现在是代码:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xmlns="http://java.sun.com/xml/ns/javaee" 
     xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
     version="2.5">


<context-param>
    <param-name>contextAppConfigLocation</param-name>
    <param-value>app-context.xml classpath*:app-context.xml</param-value>
</context-param>
<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/spring/servlet-context.xml classpath*:servlet-context.xml</param-value>
</context-param>

<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

<!-- Enables Spring Security -->
<filter>
    <filter-name>springSecurityFilterChain</filter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
    <filter-name>springSecurityFilterChain</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

<servlet>
    <servlet-name>appServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextAppConfigLocation</param-name>
        <param-value>app-context.xml</param-value>            
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet>
    <servlet-name>contextServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/spring/servlet-context.xml</param-value>

    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>          
<servlet-mapping>
    <servlet-name>appServlet</servlet-name>
    <url-pattern>/</url-pattern>
    <servlet-name>contextServlet</servlet-name>
    <url-pattern>/</url-pattern>        
</servlet-mapping>    
<session-config>
    <session-timeout>
        30
    </session-timeout>
</session-config>        
</web-app>

我所做的一切都无法在 Tomcat 中启动应用程序。

【问题讨论】:

    标签: java tomcat


    【解决方案1】:

    Spring Web 项目中的 Application Context 和 Servlet Context 是有区别的。 我们用来配置Application Context,用法和你的用法一样

    <context-param>
        <param-name>contextAppConfigLocation</param-name>
        <param-value>classpath:app-context.xml</param-value>
    </context-param>
    

    对于 Servlet 上下文,默认情况下 web 容器会尝试在 WEB-INF 目录中查找 #servlet-name#-servlet.xml,因此对于您的问题,您需要将您的问题移动到 WEB-INF 目录并更改其名称到相应的名称(contextServlet-servlet.xml、appServlet-servlet.xml)

    【讨论】:

      【解决方案2】:

      正如错误所说,这是 servlet-context.xml 文件位置的问题。改变路径和 它应该可以正常工作。

      【讨论】:

      • 你看,我尝试了以下路径:使用 /spring/ 文件夹没有它,使用 /WEB-INF/spring 并且没有它;仍然没有快乐......所以我很抱歉,但这显然不是问题。该文件位于 WEB-INF/spring/... 那么,我应该将路径更改为什么???
      【解决方案3】:

      我通过将servlet.xml 放置在正确的位置(即WEB-INF 文件夹下)解决了同样的错误。你也可以试试。

      【讨论】:

        【解决方案4】:

        如果要更改 spring 配置文件的位置和命名约定,则应在 DispatcherServlet 定义中添加 contextConfigLocation,例如:

        <servlet>
          <servlet-name>appServlet</servlet-name>
          <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
          <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:app-context.xml</param-value>
          </init-param>
          <load-on-startup>1</load-on-startup>
        </servlet>
        

        请注意,app-context.xml 应位于 src 文件夹的根目录中,否则您必须在类路径中指定路径或 WEB-INF 中的路径,不带 classpath: 前缀。

        更多详情请参考这个答案:https://stackoverflow.com/a/14956773/120794

        【讨论】:

          【解决方案5】:

          几个月前我也遇到了同样的问题。这解决了我使用 Maven 而不是下载的 Spring 版本以及 web.xml 中的一些更改的问题。

          pom.xml

          <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
            <modelVersion>4.0.0</modelVersion>
            <groupId>SpringWEB1</groupId>
            <artifactId>SpringWEB1</artifactId>
            <version>1</version>
            <packaging>war</packaging>
            <build>
              <sourceDirectory>src</sourceDirectory>
              <plugins>
                <plugin>
                  <artifactId>maven-war-plugin</artifactId>
                  <version>2.4</version>
                  <configuration>
                    <warSourceDirectory>WebContent</warSourceDirectory>
                    <failOnMissingWebXml>false</failOnMissingWebXml>
                  </configuration>
                </plugin>
                <plugin>
                  <artifactId>maven-compiler-plugin</artifactId>
                  <version>3.1</version>
                  <configuration>
                    <source>1.7</source>
                    <target>1.7</target>
                  </configuration>
                </plugin>
              </plugins>
            </build>
            <dependencies>
              <dependency>
                  <groupId>org.springframework</groupId>
                  <artifactId>spring-webmvc</artifactId>
                  <version>4.1.7.RELEASE</version>
              </dependency>
              <dependency>
                  <groupId>javax.servlet</groupId>
                  <artifactId>servlet-api</artifactId>
                  <version>2.5</version>
              </dependency>
              <dependency>
                  <groupId>commons-logging</groupId>
                  <artifactId>commons-logging</artifactId>
                  <version>1.2</version>
              </dependency>
            </dependencies>
          </project>
          

          Controller.java

          package com.jmtm.controller;
          
          import org.springframework.web.bind.annotation.RequestMapping;
          import org.springframework.web.servlet.ModelAndView;
          
          @org.springframework.stereotype.Controller
          public class Controller {
          
              @RequestMapping("/hi")
              public ModelAndView hi(){
                  return new ModelAndView("Hello", "msg", "Hello user.");
              }
          
          }
          

          spring-servlet.xml

          <?xml version="1.0" encoding="UTF-8"?>
          <beans xmlns="http://www.springframework.org/schema/beans"
              xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
              xmlns:c="http://www.springframework.org/schema/c"
              xmlns:context="http://www.springframework.org/schema/context"
              xmlns:mvc="http://www.springframework.org/schema/mvc"
              xmlns:p="http://www.springframework.org/schema/p"
              xmlns:util="http://www.springframework.org/schema/util"
              xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
                  http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd
                  http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsd
                  http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.1.xsd">
          
              <context:component-scan base-package="com.jmtm.controller"></context:component-scan>
          
              <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
                  <property name="prefix">
                      <value>/</value>
                  </property>
                  <property name="suffix">
                      <value>.jsp</value>
                  </property>
              </bean>
          
          </beans>
          

          解决方案中最重要的部分,在 web.xml 中包含 servlet 调度程序(A.K.A. spring-servlet.xml)的路径

          <?xml version="1.0" encoding="UTF-8"?>
          <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
            <display-name>SpringWEB1</display-name>
            <welcome-file-list>
              <welcome-file>index.jsp</welcome-file>
            </welcome-file-list>
          
            <servlet>
                  <servlet-name>spring</servlet-name>
                  <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
                  <init-param>
                      <param-name>contextConfigLocation</param-name>
                      <param-value>/WEB-INF/spring-servlet.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>
          
          </web-app>
          

          当我尝试解决这个问题时,发生了一些奇怪的事情。任何从maven.springframework.org/release/org/springframework/spring 下载的 Spring 版本都会给我带来很多问题(Tomcat 找不到 servlet,Spring 停止 Tomcat,Eclipse 无法启动服务器 {weird}),所以有很多问题可以找到许多部分解决方案。我希望这对你有用。

          作为额外帮助,在 Eclipse 中,从 Eclipse Marketplace 下载 Spring STS Tool for Eclipse,这将帮助您创建配置文件 (servlet.xml) 并在 web.xml 文件中为 servlet 编写代码。

          【讨论】:

            猜你喜欢
            • 2022-01-18
            • 2015-01-16
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-06-05
            • 2023-03-15
            • 2016-04-04
            • 1970-01-01
            相关资源
            最近更新 更多