исключение java.io.FileNotFoundException: для диспетчерского сервера в веб-приложении

#java #xml #spring-mvc #filenotfoundexception

#java #xml #spring-mvc #исключение filenotfoundexception

Вопрос:

У меня есть программа, которую я запускаю в проекте Spring, которая всегда терпит неудачу из-за java.io.FileNotFoundException , когда дело доходит до определения местоположения DispatcherServlet .

Он 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());`
  

Что совсем не лучший способ.

Но если я попытаюсь поместить DispatcherServlet в папку под WEB-INF , например, WEB-INFresources для удовлетворения CLASSPATH , файл все еще не найден. Из-за этого я не могу использовать ClassPathXmlApplicationContext .

Я решил эту проблему, установив свой web.xml файл следующим образом:

 <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>  
  

Приложение работает так же, как и тестовая программа с:

 ConfigurableApplicationContext context = new ClassPathXmlApplicationContext("project-servlet.xml");
  

Я должен добавить, что у меня есть один project-servlet.xml файл, который настраивает все.

Комментарии:

1. Какова полная трассировка стека исключений и какой код вызывает эту трассировку стека?

2. Папка WEB-INF отсутствует в пути к классу. Папки WEB-INF/classes и WEB-INF/lib по умолчанию включены в путь к классу. Также попробуйте использовать WebApplicationContext, используя ContextLoaderListener в вашем web.xml для настройки вашего контекста Spring.

Ответ №1:

Код не имеет смысла. ClassPathXmlApplicationContext, как указывает его имя, используется для загрузки XML-файла из ресурса classpath. Но вы передаете ему путь к файлу. Прочитайте javadoc:

Автономный контекст XML-приложения, берущий файлы определения контекста из пути к классу, интерпретирующий простые пути как имена ресурсов пути к классу, которые включают путь к пакету (например, «mypackage/myresource.txt «)

Что составляет путь к классу веб-приложения, так это каталог WEB-INF/classes и все файлы jar внутри WEB-INF/lib. Итак, ваш XML-файл отсутствует в CLASSPATH и, следовательно, не может быть загружен с использованием ClassPathXmlApplicationContext.

Если вы хотите загрузить контекстный файл из WEB-INF, используйте XmlWebApplicationContext.

В любом случае вам не нужно делать это вручную, поскольку веб-приложение Spring обычно настраивается с использованием web.xml файл или использование JavaConfig, как описано в документации.