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. Что случилось?

829   13  

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

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

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

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 и, следовательно, это уже не файл, а ресурс внутри этого пакета. Попробуй загрузчика.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/spring of appliationContext.xml.

где, как; в коде; если он объявлен как ниже

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

это выглядит бобы.xml at WEB-INF/classes или в eclipse src/main/resources.

[если вы добавили beans.xml at src/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.

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

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

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

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

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

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

шаги устранения неполадок

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

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

Comments

    Ничего не найдено.