Автор оригинала: Eugen Paraschiv.
1. Обзор
В этой статье мы обсудим пружину org.springframework.beans.factory.BeanDefinitionStoreException – обычно это ответственность BeanFactory когда определение компонента недопустимо, загрузка этого компонента проблематична. В статье будут рассмотрены наиболее распространенные причины этого исключения, а также решение для каждого из них.
2. Причина: java.io.FileNotFoundException
Существует несколько возможных причин, по которым BeanDefinitionStoreException может быть вызвано базовым IOException :
2.1. Исключение IOException Разбор XML-Документа Из Ресурса ServletContext
Обычно это происходит в веб-приложении Spring, когда DispatcherServlet настроен в web.xml для весеннего MVC:
mvc org.springframework.web.servlet.DispatcherServlet
По умолчанию Spring будет искать файл с точным именем springMvcServlet-servlet.xml в каталоге /WEB-INF веб-приложения.
Если этот файл не существует, то будет выдано следующее исключение:
org.springframework.beans.factory.BeanDefinitionStoreException: Ioexception Parsing Xml Document from Servletcontext Resource [/WEB-INF/mvc-servlet.xml]; nested exception is java.io.FileNotFoundException: Could not open ServletContext resource [/WEB-INF/mvc-servlet.xml]
Решение , конечно, состоит в том, чтобы убедиться, что mvc-servlet.xml файл действительно существует в /WEB-INF ; если это не так, то можно создать образец:
2.2. Исключение IOException Синтаксический Анализ XML-Документа Из Ресурса Пути К Классу
Обычно это происходит, когда что-то в приложении указывает на XML-ресурс, который не существует или находится не там, где должен быть.
Указание на такой ресурс может происходить различными способами.
Используя, например, конфигурацию Java, это может выглядеть следующим образом:
@Configuration @ImportResource("beans.xml") public class SpringConfig {...}
В XML это будет:
Или даже путем создания контекста Spring XML вручную:
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
Все это приведет к одному и тому же исключению, если файл не существует:
org.springframework.beans.factory.BeanDefinitionStoreException: Ioexception Parsing Xml Document from Servletcontext Resource [/beans.xml]; nested exception is java.io.FileNotFoundException: Could not open ServletContext resource [/beans.xml]
решение состоит в том, чтобы создать файл и поместить его в каталог /src/main/resources проекта – таким образом, файл будет существовать в пути к классу, и он будет найден и использован Spring.
3. Причина: Не Удалось Разрешить Заполнитель …
Эта ошибка возникает, когда Spring пытается разрешить свойство, но не может – по одной из многих возможных причин.
Но сначала, использование свойства – это может быть использовано в XML:
... value="${some.property}" ...
Это свойство также может использоваться в коде Java:
@Value("${some.property}") private String someProperty;
Первое, что нужно проверить, – это то, что имя свойства действительно соответствует определению свойства; в этом примере нам нужно определить следующее свойство:
some.property=someValue
Затем нам нужно проверить, где файл свойств определен в Spring – это подробно описано в моем Properties with Spring Tutorial . Рекомендуется иметь все файлы свойств в каталоге /src/main/resources приложения и загружать их через:
"classpath:app.properties"
Переходя от очевидного – еще одна возможная причина, по которой Spring не может разрешить свойство, заключается в том, что в контексте Spring может быть несколько PropertyPlaceholderConfigurer beans (или несколько property-placeholder элементов)
Если это так, то решение либо сворачивает их в один, либо настраивает один в родительском контексте с помощью ignoreUnresolvablePlaceholders .
4. Причина: java.lang.noSuchMethod error
Эта ошибка проявляется в различных формах – одной из наиболее распространенных является:
org.springframework.beans.factory.BeanDefinitionStoreException: Unexpected exception parsing XML document from ServletContext resource [/WEB-INF/mvc-servlet.xml]; nested exception is java.lang.NoSuchMethodError: org.springframework.beans.MutablePropertyValues.add (Ljava/lang/String;Ljava/lang/Object;) Lorg/springframework/beans/MutablePropertyValues;
Обычно это происходит, когда в пути к классу имеется несколько версий Spring. Наличие более старой версии Spring случайно в пути к классам проекта встречается чаще, чем можно было бы подумать – я описал проблему и решение для этого в статье Spring Security with Maven .
Короче говоря, решение этой ошибки простое – проверьте все весенние банки на пути к классу и убедитесь, что все они имеют одну и ту же версию – и эта версия 3.0 или выше.
Аналогично, исключение не ограничивается MutablePropertyValues bean – существует несколько других воплощений той же проблемы, вызванной той же несогласованностью версий:
org.springframework.beans.factory.BeanDefinitionStoreException: Unexpected exception parsing XML document from class path resource [/WEB-INF/mvc-servlet.xml]; - nested exception is java.lang.NoSuchMethodError: org.springframework.util.ReflectionUtils.makeAccessible(Ljava/lang/reflect/Constructor;)V
5. Причина: java.lang.NoClassDefFoundError
Общей проблемой, аналогично связанной с Maven и существующими зависимостями Spring, является:
org.springframework.beans.factory.BeanDefinitionStoreException: Unexpected exception parsing XML document from ServletContext resource [/WEB-INF/mvc-servlet.xml]; nested exception is java.lang.NoClassDefFoundError: org/springframework/transaction/interceptor/TransactionInterceptor
Это происходит, когда транзакционная функциональность настроена в конфигурации XML:
NoClassDefFoundError означает, что поддержка транзакций Spring, а именно spring-tx , не существует в пути к классу.
Решение простое – spring-tx должен быть определен в Maven pom:
org.springframework spring-tx 4.1.0.RELEASE
Конечно, это не ограничивается функциональностью транзакции – аналогичная ошибка возникает, если AOP также отсутствует:
Exception in thread "main" org.springframework.beans.factory.BeanDefinitionStoreException: Unexpected exception parsing XML document from class path resource [/WEB-INF/mvc-servlet.xml]; nested exception is java.lang.NoClassDefFoundError: org/aopalliance/aop/Advice
Теперь требуются следующие банки: spring-aop (и неявно aopalliance ):
org.springframework spring-aop 4.1.0.RELEASE
6. Заключение
В конце этой статьи у нас должна быть четкая карта для навигации по множеству причин и проблем, которые могут привести к исключению хранилища определений Bean, а также хорошее представление о том, как исправить все эти проблемы.
Примеры реализации некоторых из этих исключений можно найти в проекте github – это проект на основе Eclipse, поэтому его должно быть легко импортировать и запускать как есть.