У нас есть приложение Spring (не являющееся веб-приложением), которое выдает исключение NoSuchBeanDefinitionException при запуске тестов в нашем Linux-окне непрерывной интеграции CruiseControl. Тест отлично работает в Windows в Eclipse.
Исключение выбрасывается в метод getBean ():
ApplicationContext context = new ClassPathXmlApplicationContext(CONTEXT_FILE);
MyBean bean = (MyBean)context.getBean("myBean");
Файл контекста довольно большой и сложный. Файл контекста находится в пути к классам, и Spring его находит. Я бы предпочел, чтобы Spring генерировал исключение при попытке загрузить файл контекста и построить зависимости, чтобы мы могли понять, с чего начать. Есть ли способ заставить Spring генерировать исключение во время создания контекста?
Вы уверены, что в CONTEXT_FILE есть компонент с именем «myBean»? Вы используете более одного файла контекста? Включили ли вы ведение журнала Spring, чтобы убедиться, что CONTEXT_FILE загружается правильно, и, кроме того, чем файл, который Spring загружает из пути к классам, является именно тем файлом, который, по вашему мнению, он должен загружаться?
Я думаю, что вы, возможно, ищете неправильное решение своей проблемы - я никогда не видел, чтобы Spring генерировал исключение NoSuchBeanDefinitionException, за исключением случая, когда запрашиваемый вами bean-компонент не определен в контексте, просто как это.
Решено. Создание экземпляра myBean в CONTEXT_FILE произошло после другого bean-компонента, который от него зависел. Это действительно не должно быть проблемой, но я подозреваю, что синтаксический анализатор в Linux должен быть более строгим. В любом случае, изменение порядка определений заставило его работать как в Windows, так и в Linux.
У меня такая же проблема. Оказалось, что это была тонкая проблема с путями к классам. В частности, мой путь к классам в Linux был настроен так, что мой каталог конфигурации, содержащий мой файл build.xml, находился после моего каталога x-jars (внешних jars), а некоторые другие beans.xml были взяты из моих x-jar, которые, как в сообщении журнала правильно сказано, что он не содержит требуемого bean-компонента. Было бы полезно, если бы полный путь к файлу beans.xml был записан в журнал с сообщением об ошибке Spring.
Хорошо, это тоже было причиной моего исключения. Сообщество Spring должно изучить это.