Подтвердить что ты не робот

Spring не может найти файл конфигурации bean xml, если он существует

Я пытаюсь создать свой первый bean в Spring, но возникла проблема с загрузкой контекста. У меня есть XML файл конфигурации bean в src/main/resources.

Я получаю следующее исключение IOException:

Исключение в потоке "main" org.springframework.beans.factory.BeanDefinitionStoreException: IOException синтаксический анализ XML-документа из ресурса пути к классу [src/main/resources/ beans.xml]; вложенное исключение

java.io.FileNotFoundException: ресурс пути класса [src/main/resources/ beans.xml] не может     быть открытым, потому что его не существует

но я этого не понимаю, так как я делаю следующий тест кода:

File f = new File("src/main/resources/beans.xml");
System.out.println("Exist test: " + f.exists());

который дает мне правду! resources находится в пути к классам. Что не так?

4b9b3361

Ответ 1

Спасибо, но это не было решением. Я понял, почему он не работает для меня.

Так как я сделал объявление:

ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");

Я думал, что буду ссылаться на корневую директорию проекта, когда там был beans.xml файл. Затем я поместил файл конфигурации в src/main/resources и изменил инициализацию на:

ApplicationContext context = new ClassPathXmlApplicationContext("src/main/resources/beans.xml");

это все еще было исключение IO.

Затем файл остался в src/main/resources/, но я изменил объявление на:

ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");

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

спасибо и приветствуем!

Edit:

Так как я получаю много людей для решения проблемы, и у меня был первый опыт работы с Spring студентом несколько лет назад, я чувствую, что хочу коротко объяснить, почему он работает.

Когда проект компилируется и упаковывается, все файлы и поддиры из 'src/main/java' в проекте идут в корневую директорию упакованной банки (артефакт, который мы хотим создать). Это же правило применяется к 'src/main/resources'.

Это соглашение, соблюдаемое многими инструментами, такими как maven или sbt при создании проекта (обратите внимание: как конфигурация по умолчанию!). Когда код (из сообщения) находился в рабочем режиме, он не мог найти ничего подобного "src/main/resources/ beans.xml" из-за того, что beans.xml находился в корневом банке ( скопирован в /beans.xml в созданном банке/ухе/войне).

При использовании ClassPaспасибоmlApplicationContext правильное объявление местоположения для определений beans xml в этом случае было "/beans.xml", так как это путь, где он принадлежит в jar, а затем в пути к классам.

Это можно проверить, распакуя банку с архиватором (т.е. rar) и посмотреть его содержимое в структуре каталогов.

Я бы рекомендовал читать статьи о classpath как дополнительные.

Ответ 2

Попробуйте следующее:

new ClassPathXmlApplicationContext("file:src/main/resources/beans.xml");

файл: укажите значение для ресурсов файловой системы, а не путь к классам.

путь к файлу может быть относительным или системным (/home/user/Work/src...)

Ответ 3

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

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

beans.xml file

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

ClassPathXmlApplicationContext("beans.xml");

Существуют два решения

  • Извлеките beans.xml из пакета и поместите в пакет по умолчанию.
  • Укажите имя пакета при его использовании.

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

Ответ 4

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

new ClassPathXmlApplicationContext("beans.xml")

Или как это

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

Ответ 5

использовать его ApplicationContext context = new FileSystemXmlApplicationContext("Beans.xml");

Ответ 6

Я подозреваю, что вы создаете .war/.jar и, следовательно, это уже не файл, а ресурс внутри этого пакета. Вместо этого попробуйте ClassLoader.getResourceAsStream(String path).

Ответ 7

Вы просмотрели каталог src. Файл xml действительно существует. Но посмотрите на класс или каталог bin/build, где установлены все ваши классы вывода. Я подозреваю, что вам понадобится только ресурс / beans.xml путь к использованию.

Ответ 8

В Spring все исходные файлы находятся внутри src/main/java. Аналогично, ресурсы обычно хранятся внутри src/main/resources. Поэтому сохраните конфигурационный файл Spring внутри папки ресурсов.

Убедитесь, что у вас есть запись ClassPath для ваших файлов внутри src/main/resources.

В .classpath проверьте следующие 2 строки. Если они отсутствуют, добавьте их.

<classpathentry path="src/main/java" kind="src"/>
<classpathentry path="src/main/resources" kind="src" />

Итак, если у вас все на месте, ниже должен работать код ниже.

ApplicationContext ctx = new ClassPaспасибоmlApplicationContext ( "Spring -Module.xml" );

Ответ 9

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

Шаги по устранению неполадок

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

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

Ответ 10

Обратите внимание, что первый 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 из appliationContext.xml.

Где как; в коде; если он указан ниже

ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");

Это выглядит как beans.xml в WEB-INF/classes ИЛИ в eclipse src/main/resources.

[Если вы добавили beans.xml в src/main/resources, тогда он может быть помещен в WEB-INF/classes при создании WAR.]

Таким образом просматриваются полностью TWO​​strong > файлы.

Я решил эту проблему, добавив поиск пути к классам при импорте в applicationContext.xml, как показано ниже

<import resource="classpath*:beans.xml" />

и удалил строку ClassPathXmlApplicationContext("beans.xml") в Java-коде, так что будет загружен только один ApplicationContext.

Ответ 11

Я сделал противоположное большинство. Я использую Force IDE Luna Java EE, и я поместил свой Beans.xml файл в пакет; однако мне предшествовала строка Beans.xml - для аргумента ClassPaспасибоMLApplicationContext - с относительным путем. Поэтому в моем основном приложении - том, который обращается к файлу Beans.xml - у меня есть:

    ApplicationContext context = 
         new ClassPathXmlApplicationContext("com/tutorialspoin/Beans.xml");

Я также заметил, что как только я переместил Beans.xml файл в пакет из папки src, в нижней левой части значка файла XML появилось изображение Bean, которого не было, когда это Файл xml находился вне пакета. Это хороший показатель, позволяющий мне знать, что теперь файл beans xml доступен через ClassPaспасибоMLAppllicationsContext.

Ответ 12

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

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

Ответ 13

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

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

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

Ответ 14

Ну, ни один из этих ответов не работает для меня.. поэтому я случайно поместил мой файл SpringProjectConfig.xml на несколько позиций, не работает. [! [Enter image

описание здесь] 1 ] 1

вот моя ошибка

Exception in thread "main" org.springframework.beans.factory.BeanDefinitionStoreException: IOException parsing XML document from class path resource [SpringProjectConfig]; nested exception is java.io.FileNotFoundException: class path resource [SpringProjectConfig] cannot be opened because it does not exist

Ответ 15

Я испытывал эту проблему, и это сводило меня с ума; В конечном итоге я обнаружил в своем файле POM.xml следующее, что стало причиной проблемы:

<resources>
    <resource>
        <directory>src/main/resources</directory>
        <filtering>true</filtering>
        <includes>
            <include>**/*.properties</include>
        </includes>
    </resource>
</resources>

Ответ 16

Я не был уверен, чтобы написать это, но, возможно, кто-то сэкономит несколько часов:

mvn clean

может сделать работу, если вся ваша конфигурация уже идеальна!

Ответ 17

Gradle: v4.10.3

IDE: IntelliJ

Я столкнулся с этой проблемой при использовании gradle для запуска моей сборки и тестирования. Копирование applicationContext.xml повсюду не помогло. Даже указание полного пути, как показано ниже, не помогло!

context = new ClassPathXmlApplicationContext("C:\\...\\applicationContext.xml");

Решение (по крайней мере для gradle) заключается в том, как gradle обрабатывает ресурсы. Для моего проекта gradle я выложил рабочую область, как это определено на https://docs.gradle.org/current/userguide/java_plugin.html#sec:java_project_layout

При запуске теста с использованием заданного по умолчанию набора задач gradle включает шаг "processTestResources", который ищет ресурсы теста в C:\.....\src\test\resources (Gradle услужливо предоставляет полный путь).

Ваш файл .properties и applicationContext.xml должны находиться в этом каталоге. Если каталог ресурсов отсутствует (как это было в моем случае), вам нужно создать его и скопировать туда файл (ы). После этого простое указание имени файла работало просто отлично.

context = new ClassPathXmlApplicationContext("applicationContext.xml");