Spring не может найти файл конфигурации XML bean, когда он существует
Я пытаюсь сделать свой первый Боб весной, но у меня проблема с загрузкой контекста.
У меня есть XML-файл конфигурации компонента в src/main/resources.
Я получаю следующее исключение IOException:
исключение в потоке "основной" орг.springframework.зернышки.фабрика.BeanDefinitionStoreException: IOException синтаксический анализ XML-документа из класса path resource [src/main/resources / beans.xml]; вложенное исключение -
java.io.FileNotFoundException: путь к классу resource [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");Это все-таки было исключение ввода-вывода.
затем файл был оставлен в 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, в этом случае было "/beans.xml", так как это путь, где он принадлежит в jar и позже в classpath.
Это можно проверить, распаковав банку с архиватором (т. е. rar) и увидеть его содержимое со структурой каталогов.
Я бы рекомендовал читать статьи о classpath как дополнительные.
попробуйте это:
new ClassPathXmlApplicationContext("file:src/main/resources/beans.xml");file: 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 и, следовательно, это уже не файл, а ресурс внутри этого пакета. Попробуй загрузчика.getResourceAsStream (String path) вместо.
вы посмотрели на каталог src. Xml-файл действительно существует там. Но посмотрите на каталог class или 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/springofappliationContext.xml.где, как; в коде; если он объявлен как ниже
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");это выглядит бобы.xml at
WEB-INF/classesили в eclipsesrc/main/resources.[если вы добавили
beans.xmlatsrc/main/resourcesзатем он может быть помещен вWEB-INF/classesпри создании войны.]совсем два файлы просматриваются.
я решил эту проблему, добавив classpath lookup при импорте в
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 .проверьте путь к классу для следующих 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 доступен ClassPathXMLAppllicationsContext.
Если эта проблема все еще сбивает вас с толку, и вы разрабатываете с помощью Eclipse, посмотрите на эту ошибку Eclipse: файлы ресурсов из "src / main / resources" неправильно включены в classpath
решение, похоже, смотрит на свойства проекта, Путь сборки Java, исходные папки. Удалите
/src/main/resourcesреж и добавить его снова. Это заставляет Eclipse напоминать, что ему нужно скопировать эти файлы в путь к классам.эта ошибка повлияла на меня при использовании "Неон" релиз "затмения". (И было очень неприятно, пока я не понял простое исправление, только что описанное)
Это потому, что applicationContect.xml или any_filename.XML не помещается под правильный путь.
шаги устранения неполадок
1: добавьте XML-файл в папку ресурсов.
2: Если у вас нет папки ресурс. Создайте его, перейдя по новой правой кнопкой мыши на папке project new > Source, назовите его ресурс и поместите свой XML-файл под ним.

Comments