Spring BeanDefinitionStoreException

Spring BeanDefinitionStoreException

1. Überblick

In diesem Artikel werden wir die Springorg.springframework.beans.factory.BeanDefinitionStoreException diskutieren - dies liegt normalerweise in der Verantwortung vonBeanFactory, wenn eine Bean-Definition ungültig ist und das Laden dieser Bean problematisch ist. In diesem Artikel werden die häufigsten Ursachen für diese Ausnahme sowie die jeweilige Lösung erläutert.

2. Ursache:java.io.FileNotFoundException

Es gibt mehrere mögliche Ursachen dafür, dassBeanDefinitionStoreException durch zugrunde liegendeIOException verursacht werden können:

2.1. IOException Analysieren eines XML-Dokuments aus der ServletContext-Ressource

Dies geschieht normalerweise in einer Spring-Webanwendung, wenn inweb.xml für Spring MVC einDispatcherServlet eingerichtet ist:


   mvc
   org.springframework.web.servlet.DispatcherServlet

Standardmäßig sucht Spring im Verzeichnis/WEB-INF der Webanwendung nach einer Datei mit dem NamenspringMvcServlet-servlet.xml.

Wenn diese Datei nicht vorhanden ist, wird die folgende Ausnahme ausgelöst:

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]

Dassolution soll natürlich sicherstellen, dass diemvc-servlet.xml-Datei tatsächlich unter/WEB-INF existiert; Ist dies nicht der Fall, kann ein Beispiel erstellt werden:




2.2. IOException Analysieren von XML-Dokumenten aus Klassenpfadressourcen

Dies geschieht normalerweise, wenn etwas in der Anwendung auf eine XML-Ressource verweist, die nicht vorhanden ist oder nicht dort platziert ist, wo sie sein sollte.

Es gibt verschiedene Möglichkeiten, auf eine solche Ressource zu verweisen.

Wenn Sie beispielsweise die Java-Konfiguration verwenden, sieht dies möglicherweise folgendermaßen aus:

@Configuration
@ImportResource("beans.xml")
public class SpringConfig {...}

In XML ist dies:

Oder sogar durch manuelles Erstellen eines Spring-XML-Kontexts:

ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");

All dies führt zu derselben Ausnahme, wenn die Datei nicht vorhanden ist:

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]

Mitsolution wird die Datei erstellt und im Verzeichnis/src/main/resources des Projekts abgelegt. Auf diese Weise ist die Datei im Klassenpfad vorhanden und wird von Spring gefunden und verwendet.

3. Ursache:Could Not Resolve Placeholder …

Dieser Fehler tritt auf, wenn Spring versucht, eine Eigenschaft aufzulösen, dies jedoch aus einem der vielen möglichen Gründe nicht möglich ist.

Aber zuerst die Verwendung der Eigenschaft - dies kann in XML verwendet werden:

... value="${some.property}" ...

Die Eigenschaft kann auch in Java-Code verwendet werden:

@Value("${some.property}")
private String someProperty;

Als Erstes muss überprüft werden, ob der Name der Eigenschaft tatsächlich mit der Eigenschaftsdefinition übereinstimmt. In diesem Beispiel muss die folgende Eigenschaft definiert sein:

some.property=someValue

Dann müssen wir überprüfen, wo die Eigenschaftendatei in Spring definiert ist - dies wird ausführlich in meinenProperties with Spring Tutorial beschrieben. Es wird empfohlen, alle Eigenschaftendateien im Verzeichnis/src/main/resourcesder Anwendung zu speichern und über Folgendes zu laden:

"classpath:app.properties"

Weiter vom Offensichtlichen - Eine weitere mögliche Ursache dafür, dass Spring die Eigenschaft nicht auflösen kann, ist, dass sich im Spring-Kontext möglicherweisemultiple PropertyPlaceholderConfigurer beans befinden (oder mehrereproperty-placeholder-Elemente).

Wenn dies der Fall ist, reduziertsolution diese entweder zu einer einzigen oder konfiguriert die im übergeordneten Kontext mitignoreUnresolvablePlaceholders.

4. Ursache:java.lang.NoSuchMethodError

Dieser Fehler tritt in verschiedenen Formen auf - eine der häufigsten ist:

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;

Dies ist normalerweise der Fall, wenn der Klassenpfad mehrere Versionen von Spring enthält. Einolder version of Spring accidentally on the project classpath zu haben ist häufiger als man denkt - ich habe das Problem und die Lösung dafür inSpring Security with Maven article beschrieben.

Kurz gesagt, die Lösung für diesen Fehler ist einfach: Überprüfen Sie alle Spring-Gläser im Klassenpfad und stellen Sie sicher, dass sie alle dieselbe Version haben. Die Version ist 3.0 oder höher.

In ähnlicher Weise ist die Ausnahme nicht auf dieMutablePropertyValues-Bohne beschränkt - es gibt mehrere andere Inkarnationen desselben Problems, die durch dieselbe Versionsinkonsistenz verursacht werden:

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. Ursache:java.lang.NoClassDefFoundError

Ein häufiges Problem, das in ähnlicher Weise mit Maven und den vorhandenen Spring-Abhängigkeiten zusammenhängt, ist:

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

Dies tritt auf, wenn die Transaktionsfunktionalität in der XML-Konfiguration konfiguriert ist:

NoClassDefFoundError bedeutet, dass die Spring Transactional-Unterstützung - nämlichspring-tx - im Klassenpfad nicht vorhanden ist.

Die Lösung ist einfach -spring-tx müssen im Maven pom definiert werden:


    org.springframework
    spring-tx
    4.1.0.RELEASE

Dies ist natürlich nicht auf die Transaktionsfunktionalität beschränkt - ein ähnlicher Fehler wird ausgelöst, wenn auch AOP fehlt:

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

Die jetzt benötigten Gläser sind:spring-aop (und implizitaopalliance):


    org.springframework
    spring-aop
    4.1.0.RELEASE

6. Fazit

Am Ende dieses Artikels sollten wir eine übersichtliche Übersicht über die verschiedenen Ursachen und Probleme haben, die zuBean Definition Store Exceptionführen können, sowie einen guten Überblick darüber, wie all diese Probleme behoben werden können.

Die Implementierung einiger dieser Ausnahmebeispiele finden Sie inthe github project - dies ist ein Eclipse-basiertes Projekt, daher sollte es einfach zu importieren und auszuführen sein, wie es ist.