簡體   English   中英

嵌套的異常是java.io.FileNotFoundException:無法打開ServletContext資源[/spring/servlet-context.xml]

[英]nested exception is java.io.FileNotFoundException: Could not open ServletContext resource [/spring/servlet-context.xml]

好的,謝謝您幫助解決最后一個問題。 這是我的新錯誤以及隨后的代碼。 我只想解決錯誤中的粗體字問題,因為這是唯一的錯誤。

[Thread-36] ContextLoader錯誤上下文初始化失敗org.springframework.beans.factory.BeanDefinitionStoreException:IOException從ServletContext資源[/spring/servlet-context.xml]解析XML文檔; 嵌套異常是java.io.FileNotFoundException:無法在org.springframework上的org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:341)處打開ServletContext資源[/spring/servlet-context.xml] 。在org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:143)處的beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:302)在org.springframework.beans.factory.support.AbstractBeanDefinitionReader處org.springframework.webs.context.support.XmlWebApplicationContext.loadBeanDefinitions(XmlWebApplicationContext.java:124)處的loadBeanDefinitions(AbstractBeanDefinitionReader.java:178)在org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:149)在org.springframework.web.context.support。在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。在org.springframework.web.context.ContextLoader.createWebApplicationContext(ContextLoader.java:276)在org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:197)刷新(AbstractApplicationContext.java:397)位於org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4701)的.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:47),位於org.apache.catalina.core.StandardContext $ 1.call(StandardContext。 org.apache.catalina.core.StandardContext $ 1.call(StandardContext.java:5199)處java.util.concurrent.FutureTask.run(java.5204)java.util.c處(Unknown Source) java.util.concurrent.ThreadPoolExecutor $ Worker.run(java.lang.Thread.run(未知源)上的oncurrent.ThreadPoolExecutor.runWorker(未知源)原因:java.io.FileNotFoundException:無法打開ServletContext org.springframework.web.context.support.ServletContextResource.getInputStream(ServletContextResource.java:117)上的資源[/spring/servlet-context.xml] org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java) :328)...其他2013年10月16日上午org.apache.catalina.core.StandardContext startInternal嚴重:錯誤listenerStart 2013年10月16日上午org.apache.catalina.core.Standard。 StandardContext startInternal SEVERE:由於先前的錯誤,導致上下文[/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中啟動應用程序。

Spring Web項目中的Application Context和Servlet 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)

就像錯誤所說,這是servlet-context.xml文件位置的問題。 更改路徑,它將正常工作。

我通過將servlet.xml放在正確的位置(即WEB-INF文件夾下)解決了相同的錯誤。 您也可以嘗試。

如果要更改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

幾個月前我有同樣的問題。 這使用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調度程序的路徑(AKA 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中下載適用於Eclipse的Spring STS工具,這將幫助您創建配置文件(servlet.xml)並在web.xml文件中編寫Servlet的代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM