Рубрики
Без рубрики

Spring BeanDefinitionStoreException

Причины и решения для исключения BeanDefinitionStoreException в Spring – FileNotFoundException, NoSuchMethodError, NoClassDefFoundError и IOException.

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