#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, как описано в документации.