Spring BeanDefinitionStoreException
1. обзор
В этой статье мы обсудим Springorg.springframework.beans.factory.BeanDefinitionStoreException - обычно за это отвечаетBeanFactory, когда определение bean-компонента недействительно, загрузка этого bean-компонента проблематична. В статье будут обсуждаться наиболее распространенные причины этого исключения, а также решение для каждого из них.
2. Причина:java.io.FileNotFoundException
Существует несколько возможных причин, по которымBeanDefinitionStoreException может быть вызван лежащим в основеIOException:
2.1. IOException Анализ XML-документа из ресурса ServletContext
Обычно это происходит в веб-приложении Spring, когдаDispatcherServlet настроен вweb.xml для Spring 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]
solution, конечно, нужен для того, чтобы убедиться, что файлmvc-servlet.xml действительно существует в/WEB-INF; если нет, то можно создать образец:
2.2. IOException Анализ XML-документа из ресурса пути к классу
Обычно это происходит, когда что-то в приложении указывает на ресурс XML, который не существует или не размещен там, где он должен быть.
Указание на такой ресурс может происходить различными способами.
Используя, например, Java Configuration, это может выглядеть так:
@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]
solution создает файл и помещает его в каталог/src/main/resources проекта - таким образом, файл будет существовать в пути к классам, и он будет найден и использован Spring.
3. Причина:Could Not Resolve Placeholder …
Эта ошибка возникает, когда 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 может бытьmultiple PropertyPlaceholderConfigurer beans (или несколько элементовproperty-placeholder)
Если это так, тоsolution либо сворачивает их в один, либо настраивает тот, который находится в родительском контексте, с помощьюignoreUnresolvablePlaceholders.
4. Причина:java.lang.NoSuchMethodError
Эта ошибка бывает в разных формах, одна из наиболее распространенных:
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. Наличиеolder version of Spring accidentally on the project classpath встречается чаще, чем можно было бы подумать - я описал проблему и ее решение вSpring Security with Maven article.
Короче говоря, решение этой ошибки простое - проверьте все jar-файлы Spring на пути к классам и убедитесь, что все они имеют одинаковую версию - и эта версия 3.0 или выше.
Точно так же исключение не ограничивается bean-компонентомMutablePropertyValues - существует несколько других воплощений той же проблемы, вызванной той же несогласованностью версий:
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 Transactional, а именно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 Definition Store Exception, а также хорошее представление о том, как исправить все эти проблемы.
Реализация некоторых из этих примеров исключений может быть найдена вthe github project - это проект на основе Eclipse, поэтому его должно быть легко импортировать и запускать как есть.