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


у меня также была аналогичная проблема, но из-за немного другой причины, поэтому обмен здесь, если это может помочь кому-нибудь.

мое местоположение файла

beans.xml file

как я использовал

ClassPathXmlApplicationContext("beans.xml");

есть два решения

  1. возьмите бобы.xml из пакета и положить в пакет по умолчанию.
  2. указать имя пакета при его использовании именно.

ClassPathXmlApplicationContext("com/mypackage/beans.xml");


src/main/resources является исходным каталогом, вы не должны ссылаться на него напрямую. Когда вы строите/пакет, содержимое копируется в нужное место на вашем classpath. Затем вы должны загрузить его следующим образом

new ClassPathXmlApplicationContext("beans.xml")

или такой

new GenericXmlApplicationContext("classpath:beans.xml");

использовать его ApplicationContext context = new FileSystemXmlApplicationContext("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.


Это то, что сработало для меня:

  new ClassPathXmlApplicationContext("classpath:beans.xml");

Если эта проблема все еще сбивает вас с толку, и вы разрабатываете с помощью Eclipse, посмотрите на эту ошибку Eclipse:файлы ресурсов из "src / main / resources" неправильно включены в classpath

решение, похоже, смотрит на свойства проекта, Путь сборки Java, исходные папки. Удалить /src/main/resources dir и добавьте его снова. Это заставляет Eclipse напоминать, что ему нужно скопировать эти файлы в путь к классам.

эта ошибка повлияла на меня при использовании "Неон" релиз "затмения". (И было очень неприятно, пока я не понял простое исправление, только что описанное)


Это потому, что applicationContect.xml или any_filename.XML не помещается под правильный путь.

устранение неисправностей шаги

1: добавьте XML-файл в папку ресурсов.

2: Если у вас нет папки ресурс. Создайте его, перейдя в новую, щелкнув правой кнопкой мыши по папке project new > Source, назовите ее ресурс и поместите под него свой XML-файл.