Spring не может найти файл конфигурации XML bean, когда он существует
Я пытаюсь сделать свой первый Боб весной, но получил проблему с загрузкой контекста. У меня есть XML-файл конфигурации компонента в src/main/resources.
Я получаю следующее исключение IOException:
исключение в потоке" main " org.springframework.зернышки.фабрика.BeanDefinitionStoreException: IOException синтаксический анализ XML-документа из ресурса пути класса [src/main/resources/beans.xml]; вложенное исключение
java.Ио.FileNotFoundException: ресурс пути к классу [src/main/resources / beans.xml] не удается быть открытым, потому что он не существует
но я не понимаю, так как я делаю следующий тест кода:
File f = new File("src/main/resources/beans.xml");
System.out.println("Exist test: " + f.exists());
что дает мне верно! resources
находится в classpath. Что случилось?
13 ответов
Спасибо, но это не решение. Я понял, почему это не работает на меня.
Так как я сделал объявление:
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
Я думал, что буду ссылаться на корневой каталог проекта, когда бобы.XML-файл был там. Затем я поместил файл конфигурации в src / main / resources и изменил инициализацию на:
ApplicationContext context = new ClassPathXmlApplicationContext("src/main/resources/beans.xml");
Это все еще было исключением IO.
затем файл был оставлен в src / main / resources / но я изменил объявление кому:
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
и он решил проблему - может быть, это будет полезно для кого-то.
спасибо и ура!
Edit:
Так как я получаю много людей пальцы вверх для решения и имел первый опыт работы с весной в качестве студента несколько лет назад, я чувствую желание объяснить вкратце, почему это работает.
когда проект компилируется и упаковывается, все файлы и подкаталоги из 'src/главная/Java в проекте идет в корневой каталог упакованная банка (артефакт, который мы хотим создать). То же правило применяется к 'src/main/resources'.
это соглашение соблюдается многими инструментами, такими как maven или sbt в процессе создания проекта (Примечание: как конфигурация по умолчанию!). Когда код (из сообщения) был в рабочем режиме, он не мог найти ничего похожего на "src/main/resources/beans.XML" из-за того, что бобы.xml был в корне jar (скопирован в /beans.xml в созданном jar / ear / war).
при использовании ClassPathXmlApplicationContext, правильное объявление местоположения для определений XML бобов, в этом случае, было "/beans.xml", так как это путь, где он принадлежит в jar и позже в classpath.
Это можно проверить, распаковав банку с архиватором (т. е. rar) и увидеть ее содержимое со структурой каталогов.
Я бы рекомендовал читать статьи о classpath в качестве дополнительного.
попробуйте это:
new ClassPathXmlApplicationContext("file:src/main/resources/beans.xml");
: preffix указывает на ресурсы файловой системы, а не путь к классам.
путь к файлу может быть относительным или системным (/home/user/Work / src...)
у меня также была аналогичная проблема, но из-за немного другой причины, поэтому обмен здесь, если это может помочь кому-нибудь.
мое местоположение файла
как я использовал
ClassPathXmlApplicationContext("beans.xml");
есть два решения
- возьмите бобы.xml из пакета и положить в пакет по умолчанию.
- указать имя пакета при его использовании именно.
ClassPathXmlApplicationContext("com/mypackage/beans.xml");
src/main/resources
является исходным каталогом, вы не должны ссылаться на него напрямую. Когда вы строите/пакет, содержимое копируется в нужное место на вашем classpath. Затем вы должны загрузить его следующим образом
new ClassPathXmlApplicationContext("beans.xml")
или такой
new GenericXmlApplicationContext("classpath:beans.xml");
Я подозреваю, что вы строите .война./jar и, следовательно, это уже не файл, а ресурс внутри этого пакета. Попробуй!--1-->загрузчика.методаgetresourceasstream(string путь) вместо.
вы посмотрели каталог src. Xml-файл действительно существует. Но посмотрите на класс или каталог bin/build, где установлены все ваши выходные классы. Я подозреваю, что вам понадобятся только ресурсы/бобы.xml-путь для использования.
обратите внимание, что первый applicationContext загружается как часть web.xml
; который упоминается ниже.
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>META-INF/spring/applicationContext.xml</param-value>
</context-param>
<servlet>
<servlet-name>myOwn-controller</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>META-INF/spring/applicationContext.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
где, как показано ниже, код также попытается создать еще один applicationContext.
private static final ApplicationContext context =
new ClassPathXmlApplicationContext("beans.xml");
посмотреть разница между beans.xml
и applicationContext.xml
и если appliationContext.xml
под <META-INF/spring/>
объявил с <import resource="beans.xml"/>
после этого appliationContext.xml
загрузки beans.xml
в том же месте META-INF/spring
of appliationContext.xml
.
где as; в коде; если он объявлен как ниже
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
это выглядит фасоль.xml at WEB-INF/classes
или в затмении src/main/resources
.
[если вы добавили beans.xml
at src/main/resources
затем он может быть помещен в WEB-INF/classes
при создании войны.]
совсем два файлы просматриваются.
я решил эту проблему, добавив поиск пути к классам при импорте в applicationContext.xml
как ниже
<import resource="classpath*:beans.xml" />
и убрал строку ClassPathXmlApplicationContext("beans.xml")
в коде java, так что будет загружен только один ApplicationContext.
весной все исходные файлы находятся внутри src / main / java. Аналогичным образом, ресурсы, как правило, хранятся внутри src/main/resources. Поэтому храните файл конфигурации spring в папке resources.
убедитесь, что у вас есть запись ClassPath для ваших файлов внутри src/main/resources.
In .classpath проверьте следующие 2 строки. Если они отсутствуют, добавьте их.
<classpathentry path="src/main/java" kind="src"/>
<classpathentry path="src/main/resources" kind="src" />
Итак, если у вас все на месте приведенный ниже код должен работа.
ApplicationContext ctx = новый ClassPathXmlApplicationContext ("Spring-Module.xml");
Я сделал противоположное большинству. Я использую Force IDE Luna Java EE, и я разместил свои бобы.xml-файл в пакете; однако я предшествовал бобам.xml-строка-для аргумента ClassPathXMLApplicationContext-с относительным путем. Поэтому в моем основном приложении-тот, который обращается к бобам.xml файл-у меня есть:
ApplicationContext context =
new ClassPathXmlApplicationContext("com/tutorialspoin/Beans.xml");
Я также заметил, что, как только я переместил бобы.xml-файл в пакет из папки src, в нижней левой части значок XML-файла, которого не было, когда этот xml-файл находился вне пакета. Это хороший показатель, позволяющий мне знать, что теперь XML-файл beans доступен Classpathxmlapplicationscontext.
Если эта проблема все еще сбивает вас с толку, и вы разрабатываете с помощью Eclipse, посмотрите на эту ошибку Eclipse:файлы ресурсов из "src / main / resources" неправильно включены в classpath
решение, похоже, смотрит на свойства проекта, Путь сборки Java, исходные папки. Удалить /src/main/resources
dir и добавьте его снова. Это заставляет Eclipse напоминать, что ему нужно скопировать эти файлы в путь к классам.
эта ошибка повлияла на меня при использовании "Неон" релиз "затмения". (И было очень неприятно, пока я не понял простое исправление, только что описанное)
Это потому, что applicationContect.xml или any_filename.XML не помещается под правильный путь.
устранение неисправностей шаги
1: добавьте XML-файл в папку ресурсов.
2: Если у вас нет папки ресурс. Создайте его, перейдя в новую, щелкнув правой кнопкой мыши по папке project new > Source, назовите ее ресурс и поместите под него свой XML-файл.