Spring BeanCreationException

1. Übersicht

In diesem Artikel diskutieren wir die Spring org.springframework.beans.factory.BeanCreationException - dies ist eine sehr häufige Ausnahme, die ausgelöst wird, wenn die BeanFactory Beans der Bean-Definitionen erstellt und auf ein Problem stößt. In diesem Artikel werden die häufigsten Ursachen dieser Ausnahme zusammen mit der Lösung erläutert.

2. Ursache: org.springframework.beans.factory.NoSuchBeanDefinitionException

Die bei weitem häufigste Ursache für die BeanCreationException ist Spring, der versucht , eine Bean zu injizieren, die im Kontext nicht vorhanden ist .

Zum Beispiel Beana versucht zu injizieren BeanB :

@Component public class BeanA { @Autowired private BeanB dependency; ... }

Wenn im Kontext kein BeanB gefunden wird, wird die folgende Ausnahme ausgelöst (Fehler beim Erstellen des Bean):

Error creating bean with name 'beanA': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.baeldung.web.BeanB cpm.baeldung.web.BeanA.dependency; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.baeldung.web.BeanB] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}

Um diese Art von Problem zu diagnostizieren, stellen Sie zunächst sicher, dass die Bean deklariert ist:

  • entweder in einer XML-Konfigurationsdatei mit dem Element
  • oder in einer Java @ Configuration- Klasse über die @ Bean- Annotation
  • oder ist mit folgenden Anmerkungen versehen: @Component , @Repository , @Service , @Controller und das Scannen von Klassenpfaden ist für dieses Paket aktiv

Überprüfen Sie auch, ob die Konfigurationsdateien oder -klassen tatsächlich von Spring aufgenommen und in den Hauptkontext geladen wurden.

3. Ursache: org.springframework.beans.factory.NoUniqueBeanDefinitionException

Eine andere ähnliche Ursache für die Bean-Erstellungsausnahme ist, dass Spring versucht, eine Bean nach Typ - nämlich nach ihrer Schnittstelle - zu injizieren und zwei oder mehr Bean zu finden, die diese Schnittstelle im Kontext implementieren .

Beispielsweise implementieren BeanB1 und BeanB2 beide dieselbe Schnittstelle:

@Component public class BeanB1 implements IBeanB { ... } @Component public class BeanB2 implements IBeanB { ... } @Component public class BeanA { @Autowired private IBeanB dependency; ... }

Dies führt dazu, dass die Spring Bean Factory die folgende Ausnahme auslöst:

Error creating bean with name 'beanA': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.baeldung.web.IBeanB com.baeldung.web.BeanA.b; nested exception is org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type [com.baeldung.web.IBeanB] is defined: expected single matching bean but found 2: beanB1,beanB2

4. Ursache: org.springframework.beans.BeanInstantiationException

4.1. Benutzerdefinierte Ausnahme

Als nächstes folgt eine Bean, die während des Erstellungsprozesses eine Ausnahme auslöst . Ein vereinfachtes Beispiel, um das Problem leicht zu veranschaulichen und zu verstehen, löst eine Ausnahme im Konstruktor der Bean aus:

@Component public class BeanA { public BeanA() { super(); throw new NullPointerException(); } ... }

Wie erwartet führt dies dazu, dass Spring mit der folgenden Ausnahme schnell ausfällt:

Error creating bean with name 'beanA' defined in file [...BeanA.class]: Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [com.baeldung.web.BeanA]: Constructor threw exception; nested exception is java.lang.NullPointerException

4.2. java.lang.InstantiationException

Ein weiteres mögliches Vorkommen der BeanInstantiationException ist das Definieren einer abstrakten Klasse als Bean in XML. Dies muss in XML erfolgen, da dies in einer Java @ Configuration-Datei nicht möglich ist und das Scannen von Klassenpfaden die abstrakte Klasse ignoriert:

@Component public abstract class BeanA implements IBeanA { ... }

Und die XML-Definition der Bean:

Dieses Setup führt zu einer ähnlichen Ausnahme:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'beanA' defined in class path resource [beansInXml.xml]: Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [com.baeldung.web.BeanA]: Is it an abstract class?; nested exception is java.lang.InstantiationException

4.3. java.lang.NoSuchMethodException

Wenn eine Bean keinen Standardkonstruktor hat und Spring versucht, ihn durch Suchen nach diesem Konstruktor zu instanziieren, führt dies zu einer Laufzeitausnahme. zum Beispiel:

@Component public class BeanA implements IBeanA { public BeanA(final String name) { super(); System.out.println(name); } }

Wenn diese Bean vom Klassenpfad-Scanmechanismus erfasst wird, ist der Fehler:

Error creating bean with name 'beanA' defined in file [...BeanA.class]: Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [com.baeldung.web.BeanA]: No default constructor found; nested exception is java.lang.NoSuchMethodException: com.baeldung.web.BeanA.()

Eine ähnliche Ausnahme, die jedoch schwieriger zu diagnostizieren ist, kann auftreten, wenn die Spring-Abhängigkeiten vom Klassenpfad nicht dieselbe Version haben . Diese Art der Versionsinkompatibilität kann aufgrund von API-Änderungen zu einer NoSuchMethodException führen . Die Lösung für ein solches Problem besteht darin, sicherzustellen, dass alle Spring-Bibliotheken genau dieselbe Version im Projekt haben.

5. Ursache: org.springframework.beans.NotWritablePropertyException

Eine weitere Möglichkeit besteht darin, eine Bean - BeanA - mit einem Verweis auf eine andere Bean - BeanB - zu definieren, ohne die entsprechende Setter-Methode in BeanA zu haben :

@Component public class BeanA { private IBeanB dependency; ... } @Component public class BeanB implements IBeanB { ... }

Und die Spring XML-Konfiguration:

Dies kann wiederum nur in der XML-Konfiguration auftreten , da der Compiler bei Verwendung von Java @Configuration die Reproduktion dieses Problems unmöglich macht.

Um dieses Problem zu lösen, muss natürlich der Setter für IBeanB hinzugefügt werden :

@Component public class BeanA { private IBeanB dependency; public void setDependency(final IBeanB dependency) { this.dependency = dependency; } }

6. Ursache: org.springframework.beans.factory.CannotLoadBeanClassException

This exception is thrown when Spring cannot load the class of the defined bean – this may occur if the Spring XML Configuration contains a bean that simply doesn't have a corresponding class. For example, if class BeanZ doesn't exist, the following definition will result in an exception:

The root cause if the ClassNotFoundException and the full exception in this case is:

nested exception is org.springframework.beans.factory.BeanCreationException: ... nested exception is org.springframework.beans.factory.CannotLoadBeanClassException: Cannot find class [com.baeldung.web.BeanZ] for bean with name 'beanZ' defined in class path resource [beansInXml.xml]; nested exception is java.lang.ClassNotFoundException: com.baeldung.web.BeanZ

7. Children of BeanCreationException

7.1. The org.springframework.beans.factory.BeanCurrentlyInCreationException

One of the subclasses of BeanCreationException is the BeanCurrentlyInCreationException; this usually occurs when using constructor injection – for example, in a case of circular dependencies:

@Component public class BeanA implements IBeanA { private IBeanB beanB; @Autowired public BeanA(final IBeanB beanB) { super(); this.beanB = beanB; } } @Component public class BeanB implements IBeanB { final IBeanA beanA; @Autowired public BeanB(final IBeanA beanA) { super(); this.beanA = beanA; } }

Spring will not be able to resolve this kind of wiring scenario and the end result will be:

org.springframework.beans.factory.BeanCurrentlyInCreationException: Error creating bean with name 'beanA': Requested bean is currently in creation: Is there an unresolvable circular reference?

The full exception is very verbose:

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'beanA' defined in file [...BeanA.class]: Unsatisfied dependency expressed through constructor argument with index 0 of type [com.baeldung.web.IBeanB]: : Error creating bean with name 'beanB' defined in file [...BeanB.class]: Unsatisfied dependency expressed through constructor argument with index 0 of type [com.baeldung.web.IBeanA]: : Error creating bean with name 'beanA': Requested bean is currently in creation: Is there an unresolvable circular reference?; nested exception is org.springframework.beans.factory.BeanCurrentlyInCreationException: Error creating bean with name 'beanA': Requested bean is currently in creation: Is there an unresolvable circular reference?; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'beanB' defined in file [...BeanB.class]: Unsatisfied dependency expressed through constructor argument with index 0 of type [com.baeldung.web.IBeanA]: : Error creating bean with name 'beanA': Requested bean is currently in creation: Is there an unresolvable circular reference?; nested exception is org.springframework.beans.factory.BeanCurrentlyInCreationException: Error creating bean with name 'beanA': Requested bean is currently in creation: Is there an unresolvable circular reference?

7.2. The org.springframework.beans.factory.BeanIsAbstractException

This instantiation exception may occur when the Bean Factory attempts to retrieve and instantiate a bean which was declared as abstract; for example:

public abstract class BeanA implements IBeanA { ... }

Declared in the XML Configuration as:

Now, if we try to retrieve BeanA from the Spring Context by name – for example when instantiating another bean:

@Configuration public class Config { @Autowired BeanFactory beanFactory; @Bean public BeanB beanB() { beanFactory.getBean("beanA"); return new BeanB(); } }

This will result in the following exception:

org.springframework.beans.factory.BeanIsAbstractException: Error creating bean with name 'beanA': Bean definition is abstract

Und die vollständige Ausnahme-Stacktrace:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'beanB' defined in class path resource [org/baeldung/spring/config/WebConfig.class]: Instantiation of bean failed; nested exception is org.springframework.beans.factory.BeanDefinitionStoreException: Factory method [public com.baeldung.web.BeanB com.baeldung.spring.config.WebConfig.beanB()] threw exception; nested exception is org.springframework.beans.factory.BeanIsAbstractException: Error creating bean with name 'beanA': Bean definition is abstract

8. Fazit

Am Ende dieses Artikels sollten wir eine übersichtliche Übersicht über die verschiedenen Ursachen und Probleme haben, die im Frühjahr zu einer BeanCreationException führen können , sowie einen guten Überblick darüber , wie all diese Probleme behoben werden können.

Die Implementierung aller Ausnahmebeispiele finden Sie im Github-Projekt - dies ist ein Eclipse-basiertes Projekt, daher sollte es einfach zu importieren und auszuführen sein, wie es ist.