Spring BeanDefinitionStoreException

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, поэтому его должно быть легко импортировать и запускать как есть.