java.io.FileNotFoundException:用于WebApp中的DispatcherServlet

java.io.FileNotFoundException:用于WebApp中的DispatcherServlet,java,xml,spring-mvc,filenotfoundexception,Java,Xml,Spring Mvc,Filenotfoundexception,我有一个在Spring项目中运行的程序,在定位DispatcherServlet时,由于java.io.FileNotFoundException而总是失败 DispatcherServlet位于\WEB-INF文件夹中,项目的其余部分可以访问它,而不会发生意外 因此,目前我被迫对DispatcherServlet的路径进行硬编码,如下所示: File config = new File("C:\\project\\build\\web\\WEB-INF\\project-servlet.xml

我有一个在Spring项目中运行的程序,在定位DispatcherServlet时,由于
java.io.FileNotFoundException
而总是失败

DispatcherServlet
位于
\WEB-INF
文件夹中,项目的其余部分可以访问它,而不会发生意外

因此,目前我被迫对DispatcherServlet的路径进行硬编码,如下所示:

File config = new File("C:\\project\\build\\web\\WEB-INF\\project-servlet.xml");
    boolean exists = Misc.checkFileExists(config.getAbsolutePath());
    if (exists) {
        System.out.println("File: " + config.getAbsolutePath() + " found.");
    }
    ConfigurableApplicationContext context = new FileSystemXmlApplicationContext(config.getAbsolutePath());`
<servlet>
    <servlet-name>project</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>  
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/classes/project-servlet.xml</param-value>
    </init-param>      
</servlet>     

<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener> 
<context-param>        
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/classes/project-servlet.xml</param-value>
</context-param>  
这根本不是最好的办法

但是,如果我试图将
DispatcherServlet
放在
\WEB-INF
下的文件夹中,例如
\WEB-INF\resources
以满足
类路径的要求,则仍然找不到该文件。因此,我不能使用
ClassPathXmlApplicationContext

我已通过如下设置我的
web.xml
文件来解决此问题:

File config = new File("C:\\project\\build\\web\\WEB-INF\\project-servlet.xml");
    boolean exists = Misc.checkFileExists(config.getAbsolutePath());
    if (exists) {
        System.out.println("File: " + config.getAbsolutePath() + " found.");
    }
    ConfigurableApplicationContext context = new FileSystemXmlApplicationContext(config.getAbsolutePath());`
<servlet>
    <servlet-name>project</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>  
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/classes/project-servlet.xml</param-value>
    </init-param>      
</servlet>     

<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener> 
<context-param>        
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/classes/project-servlet.xml</param-value>
</context-param>  

我应该补充一点,我只有一个
projectservlet.xml
文件来配置所有内容。

代码没有任何意义。ClassPathXmlApplicationContext,顾名思义,用于从类路径资源加载XML文件。但是您正在传递一个文件的路径。阅读:

独立XML应用程序上下文,从类路径获取上下文定义文件,将普通路径解释为包含包路径的类路径资源名称(例如“mypackage/myresource.txt”)

构成web应用程序类路径的是目录web-INF/classes和web-INF/lib中的所有jar文件。因此,您的XML文件不在类路径中,因此无法使用ClassPathXmlApplicationContext加载

如果要从WEB-INF加载上下文文件,请使用


无论如何,您不必手动执行此操作,因为Spring web应用程序通常使用web.xml文件或JavaConfig进行配置,如中所述。

什么是完整的异常堆栈跟踪,以及导致此堆栈跟踪的代码是什么?添加到问题中。web-INF文件夹不在类路径上。默认情况下,类路径中包括WEB-INF/classes和WEB-INF/lib文件夹。还可以尝试在web.xml中使用ContextLoaderListener使用WebApplicationContext来配置Spring上下文。