【问题标题】:Could not open ServletContext resource (Spring)无法打开 ServletContext 资源 (Spring)
【发布时间】:2018-03-25 22:03:21
【问题描述】:

社区。 我开始使用 Spring 框架,我只想完成一个 Hello World Web 应用程序。但是当我尝试运行应用程序时发生了这些错误。

org.springframework.beans.factory.BeanDefinitionStoreException: IOException parsing XML document from ServletContext resource [/web/WEB-INF/applicationConfig.xml]; nested exception is java.io.FileNotFoundException: Could not open ServletContext resource [/web/WEB-INF/applicationConfig.xml]
org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:343)
org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:303)
org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:187)
org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:223)
org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:194)
org.springframework.web.context.support.XmlWebApplicationContext.loadBeanDefinitions(XmlWebApplicationContext.java:125)
org.springframework.web.context.support.XmlWebApplicationContext.loadBeanDefinitions(XmlWebApplicationContext.java:94)
org.springframework.context.support.AbstractRefreshableApplicationContext.refreshBeanFactory(AbstractRefreshableApplicationContext.java:133)
org.springframework.context.support.AbstractApplicationContext.obtainFreshBeanFactory(AbstractApplicationContext.java:620)
org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:521)
org.springframework.web.servlet.FrameworkServlet.configureAndRefreshWebApplicationContext(FrameworkServlet.java:676)
org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:642)
org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:690)
org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:558)
org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:499)
org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:172)
javax.servlet.GenericServlet.init(GenericServlet.java:158)
org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:496)
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81)
org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:650)
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342)
org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:803)
org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:790)
org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1459)
org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
java.lang.Thread.run(Thread.java:748) 

我已经阅读了许多解决方案,但没有一个没有帮助。我使用:maven、spring 5.0.4、IntelijIDEA、Tomcat 8.5.29

文件 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>ru.ladence.helloweb</groupId>
<artifactId>helloweb</artifactId>
<packaging>war</packaging>
<version>1.0-SNAPSHOT</version>

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
                <source>1.8</source>
                <target>1.8</target>
            </configuration>
        </plugin>


        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-war-plugin</artifactId>
            <version>2.5</version>
            <configuration>
                <webResources>
                    <resources>
                        <directory>WebContent</directory>
                        <includes>
                            <include>**/*.*</include><!--this line includes the xml files into the war, which will be found when it is exploded in server during deployment -->
                        </includes>
                        <excludes>
                            <exclude>*.java</exclude>
                        </excludes>
                    </resources>
                </webResources>
                <webXml>WebContent/WEB-INF/web.xml</webXml>
            </configuration>
        </plugin>
    </plugins>


</build>

<dependencies>
    <!-- https://mvnrepository.com/artifact/junit/junit -->
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
    </dependency>

    <!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>5.0.4.RELEASE</version>
    </dependency>


</dependencies>

文件 web.xml

 <?xml version="1.0" encoding="UTF-8"?>
   <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee 
     http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
     version="4.0">

<servlet>
    <servlet-name>HelloWeb</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/web/WEB-INF/applicationConfig.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

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

我知道 Spring Context 命名约定 [servlet-name]-servlet.xml 有什么,但它没有帮助

【问题讨论】:

    标签: java spring jsp spring-mvc


    【解决方案1】:

    contextConfigLocation 值中删除/web

    <servlet>
      <servlet-name>HelloWeb</servlet-name>
      <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
      <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/applicationConfig.xml</param-value>
      </init-param>
      <load-on-startup>1</load-on-startup>
    </servlet>
    

    作为 WAR 文件应该有一个顶级的 WEB-INF 目录,而不是 web/WEB-INF

    简化您的maven-war-plugin 配置,因为您将资源原样包含在内,而不进行过滤:

    <configuration>
      <webResources>
        <resources>
          <directory>WebContent</directory>
        </resources>
      </webResources>
    </configuration>
    

    根据this answer,您可能希望使用src/main/webapp 而不是WebContent

    【讨论】:

    • 它没有帮助:(
    • @Ladence 当您使用 Maven 构建项目时,WEB-INF 导向器是否包含在您的 WAR 文件中 mvn clean package 之后?
    • 我很困惑,因为您问题中的maven-war-plugin 配置为使用&lt;directory&gt;WebContent&lt;/directory&gt;,但您的WEB-INF 位于web 目录下,而不是WebContent 目录下。 &lt;param-value&gt; 必须以一种或另一种方式引用 WAR 中的内容。
    • 对不起,包含WEB-INF目录但该目录只包含web.xml,没有applicationConfig
    • @Ladence 看起来像&lt;include&gt; 模式的问题,用maven-war-plugin 的简化配置更新了我的答案
    猜你喜欢
    • 2022-01-18
    • 1970-01-01
    • 2015-02-03
    • 1970-01-01
    • 2014-04-16
    • 2016-04-04
    • 2015-01-16
    • 2018-12-18
    • 1970-01-01
    相关资源
    最近更新 更多