Tavaszi BeanCreationException

1. Áttekintés

Ebben a cikkben a Tavaszi org.springframework.beans.factory.BeanCreationException - ez egy nagyon gyakori kivétel, amikor a BeanFactory babdefiníciókat hoz létre, és problémát tapasztal. A cikk a megoldás mellett tárgyalja ennek a kivételnek a leggyakoribb okait.

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

Messze a leggyakoribb oka a BeanCreationException próbál tavasz beadjon egy babot, amely nem létezik a kontextusban.

Például, BeanA beadni próbál BeanB:

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

Ha egy BeanB nem található a kontextusban, akkor a következő kivételt dobja (Error Creating Bean):

Hiba a „beanA” nevű bab létrehozásakor: Az automatikus vezetésű függőségek injektálása sikertelen; beágyazott kivétel az org.springframework.beans.factory.BeanCreationException: Nem sikerült automatikusan bekötni a mezőt: private com.baeldung.web.BeanB cpm.baeldung.web.BeanA.dependency; a beágyazott kivétel az org.springframework.beans.factory.NoSuchBeanDefinitionException: Nem található [com.baeldung.web.BeanB] típusú minősítő bab függőségre: várhatóan legalább 1 bab, amely automatikus függvényjelöltnek minősül ennek a függőségnek. Függőségi jelölések: {@ org.springframework.beans.factory.annotation.Autowired (kötelező = igaz)}

Az ilyen típusú problémák diagnosztizálásához először győződjön meg arról, hogy a bab be van-e jelölve:

  • akár egy XML konfigurációs fájlban a elem
  • vagy Java-ban @ Konfiguráció osztály a @Bab annotáció
  • vagy a következőkkel van kiegészítve: @Összetevő, @Raktár, @Szolgáltatás, @Vezérlő és az osztályút keresése aktív az adott csomaghoz

Ellenőrizze azt is, hogy a konfigurációs fájlokat vagy osztályokat Spring valóban felvette-e és betöltötte-e a fő kontextusba.

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

A bab létrehozásának kivételének másik hasonló oka az, hogy Spring megpróbálja beadni a babot típus szerint - nevezetesen az interfésze alapján - és megtalálja két vagy több bab, amely az interfészt megvalósítja a kontextusban.

Például, BabB1 és BabB2 mindkettő ugyanazt az interfészt valósítja meg:

@Bomponent public class BeanB1 implementálja az IBeanB {...} @Component public class BeanB2 implementálja az IBeanB {...} @Component public class BeanB {@Autowired private IBeanB dependency; ...}

Ez a következő kivételt eredményezi a tavaszi babgyárban:

Hiba a „beanA” nevű bab létrehozásakor: Az automatikus vezetésű függőségek injektálása nem sikerült; beágyazott kivétel az org.springframework.beans.factory.BeanCreationException: Nem sikerült automatikusan bekötni a mezőt: private com.baeldung.web.IBeanB com.baeldung.web.BeanA.b; beágyazott kivétel az org.springframework.beans.factory.NoUniqueBeanDefinitionException: Nincs meghatározva a [com.baeldung.web.IBeanB] típusú minősített bab: várható egyetlen egyező bab, de 2 található: beanB1, beanB2

4. Ok: org.springframework.beans.BeanInstantiationException

4.1. Egyedi kivétel

A sorban következő a bab, amely kivételt dob ​​a létrehozása során; Egy egyszerűsített minta, amely könnyen példázza és megérti a problémát, kivételt vet a bab konstruktorába:

@ Component public class BeanA {public BeanA () {super (); dobja új NullPointerException (); } ...}

Ahogy az várható volt, ez a következő kivétellel a tavasz gyors kudarcához vezet:

Hiba történt a [... BeanA.class] fájlban definiált „beanA” nevű bab létrehozásakor: A bab példányosítása sikertelen; beágyazott kivétel az org.springframework.beans.BeanInstantiationException: Nem sikerült példányosítani a bab osztályt [com.baeldung.web.BeanA]: A kivitelező kivételt dobott; beágyazott kivétel a java.lang.NullPointerException

4.2. java.lang.InstantiationException

A. Másik lehetséges előfordulása BeanInstantiationException egy absztrakt osztályt definiál babként az XML-ben; ennek XML-ben kell lennie, mert Java @Configuration fájlban erre nincs mód, és az classpath szkennelés figyelmen kívül hagyja az absztrakt osztályt:

@ Component public absztrakt osztály BeanA megvalósítja az IBeanA-t {...}

És a bab XML meghatározása:

Ez a beállítás hasonló kivételt eredményez:

org.springframework.beans.factory.BeanCreationException: Hiba a „beanA” nevű bab létrehozásakor az osztályútvonal erőforrásban definiált [beansInXml.xml] fájlban: A bab példányosítása sikertelen; beágyazott kivétel az org.springframework.beans.BeanInstantiationException: Nem sikerült példányosítani a bab osztályt [com.baeldung.web.BeanA]: Ez egy elvont osztály ?; beágyazott kivétel a java.lang.InstantiationException

4.3. java.lang.NoSuchMethodException

Ha egy babnak nincs alapértelmezett konstruktora, és Spring megpróbálja azt példányosítani, keresve azt a konstruktort, ez futásidejű kivételt eredményez; például:

@ Component public class BeanA implementálja az IBeanA {public BeanA (végleges karakterlánc neve) {super (); System.out.println (név); }}

Amikor ezt a babot felveszi az osztályút keresési mechanizmus, a hiba a következő lesz:

Hiba történt a [... BeanA.class] fájlban definiált „beanA” nevű bab létrehozásakor: A bab példányosítása sikertelen; a beágyazott kivétel az org.springframework.beans.BeanInstantiationException: A bab osztály nem sikerült példányosítani [com.baeldung.web.BeanA]: Nem található alapértelmezett konstruktor; beágyazott kivétel a java.lang.NoSuchMethodException: com.baeldung.web.BeanA. ()

Hasonló kivétel, de nehezebben diagnosztizálható kivétel akkor fordulhat elő, ha az osztályút tavaszi függőségeiben nincs ugyanaz a változat; ez a fajta verzió-összeférhetetlenség a NoSuchMethodException az API-változtatások miatt. Egy ilyen probléma megoldása annak biztosítása, hogy az összes Spring könyvtár pontosan ugyanazzal a verzióval rendelkezzen a projektben.

5. Ok: org.springframework.beans.NotWritablePropertyException

Egy másik lehetőség a bab meghatározása - BeanA - egy másik babra hivatkozva - BeanB - a megfelelő szetter módszer nélkül BeanA:

@ Component public class BeanA {private IBeanB dependency; ...} @Component public class BeanB implementálja az IBeanB-t {...}

És a tavaszi XML-konfiguráció:

Megint ez csak XML konfigurációban fordulhat elő, mert a Java használatakor @ Konfiguráció, a fordító lehetetlenné teszi a kérdés reprodukálását.

Természetesen a probléma megoldásához hozzá kell adni a beállítót IBeanB:

@ Component public class BeanA {private IBeanB dependency; public void setDependency (végső IBeanB függőség) {this.dependency = függőség; }}

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

Ezt a kivételt akkor dobják A tavasz nem töltheti be a meghatározott bab osztályát - ez akkor fordulhat elő, ha a tavaszi XML-konfiguráció olyan babot tartalmaz, amelynek egyszerűen nincs megfelelő osztálya. Például, ha osztály BeanZ nem létezik, a következő meghatározás kivételt eredményez:

A kiváltó ok, ha a ClassNotFoundException és a teljes kivétel ebben az esetben:

beágyazott kivétel az org.springframework.beans.factory.BeanCreationException: ... beágyazott kivétel az org.springframework.beans.factory.CannotLoadBeanClassException: Nem található a [com.baeldung.web.BeanZ] osztály babhoz, amelynek neve „beanZ”. class path erőforrás [beansInXml.xml]; beágyazott kivétel a java.lang.ClassNotFoundException: com.baeldung.web.BeanZ

7. Gyermekei BeanCreationException

7.1. A org.springframework.beans.factory.BeanCurrentlyInCreationException

Egyik alosztálya BeanCreationException az a BeanCurrentlyInCreationException; ez általában konstruktor injekció használatakor fordul elő - például kör alakú függőségek esetén:

@ Component public class BeanA végrehajtja az IBeanA {private IBeanB beanB; @Autowired public BeanA (végső IBeanB beanB) {super (); ez.babB = babB; }} @Component public class BeanB implementálja az IBeanB {végső IBeanA beanA; @Autowired public BeanB (végső IBeanA beanA) {super (); ez.babA = babA; }}

A tavasz nem tudja megoldani ezt a fajta bekötési forgatókönyvet, és a végeredmény a következő lesz:

org.springframework.beans.factory.BeanCurrentlyInCreationException: Hiba történt a „beanA” nevű bab létrehozásakor: A kért bab jelenleg készülőben van: Van megoldhatatlan kör alakú hivatkozás?

A teljes kivétel nagyon bőbeszédű:

org.springframework.beans.factory.UnsatisfiedDependencyException: Hiba történt a [beanA.class] fájlban definiált 'beanA' nevű bab létrehozásakor: A [com.baeldung.web.IBeanB] típusú 0 indexű konstruktor argumentumon keresztül kifejezhetetlen kielégítetlen függőség :: Hiba a [beanB.class] fájlban definiált 'beanB' nevű bab létrehozásakor: A [com.baeldung.web.IBeanA] típusú 0 indexű konstruktor argumentumán keresztül kifejlesztett kielégítetlen függőség:: Hiba a névvel készült bab létrehozásakor ' beanA ': A kért bab jelenleg készítés alatt áll: Van-e megoldhatatlan kör alakú hivatkozás ?; beágyazott kivétel az org.springframework.beans.factory.BeanCurrentlyInCreationException: Hiba történt a „beanA” nevű bab létrehozásakor: A kért bab jelenleg készítés alatt van: Van megoldhatatlan kör alakú hivatkozás ?; beágyazott kivétel az org.springframework.beans.factory.UnsatisfiedDependencyException: Hiba történt a [... BeanB.class] fájlban definiált 'beanB' nevű bab létrehozásakor: Nem kielégített függőség a [com.baeldung.web típusú 0 indexű konstruktor argumentumban fejeződik ki .IBeanA]:: Hiba a „beanA” nevű bab létrehozásakor: A kért bab jelenleg készül: Van-e megoldhatatlan kör alakú hivatkozás ?; beágyazott kivétel az org.springframework.beans.factory.BeanCurrentlyInCreationException: Hiba történt a „beanA” nevű bab létrehozásakor: A kért bab jelenleg készítés alatt van: Van megoldhatatlan körkörös hivatkozás?

7.2. A org.springframework.beans.factory.BeanIsAbstractException

Ez a kivételes eset akkor fordulhat elő, amikor a Babgyár megkísérli az elvontnak nyilvánított bab beolvasását és példányosítását; például:

nyilvános absztrakt osztály BeanA végrehajtja az IBeanA-t {...}

Az XML-konfigurációban a következőképpen deklarálva:

Most, ha megpróbáljuk visszahoz BeanA a tavaszi kontextusból név szerint - például egy másik bab példányosításakor:

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

Ez a következő kivételt eredményezi:

org.springframework.beans.factory.BeanIsAbstractException: Hiba a „beanA” nevű bab létrehozásakor: A bab definíciója elvont

És a teljes kivétel a stacktrace:

org.springframework.beans.factory.BeanCreationException: Hiba történt a „beanB” nevű bab létrehozásakor az osztály elérési útjának erőforrásában [org / baeldung / spring / config / WebConfig.class]: A bab példányosítása sikertelen; beágyazott kivétel az org.springframework.beans.factory.BeanDefinitionStoreException: Gyári módszer [public com.baeldung.web.BeanB com.baeldung.spring.config.WebConfig.beanB ()] dobta a kivételt; beágyazott kivétel az org.springframework.beans.factory.BeanIsAbstractException: Hiba történt a „beanA” nevű bab létrehozásakor: A bab definíciója elvont

8. Következtetés

A cikk végén világos térképpel kell rendelkeznünk, hogy eligazodhassunk a különböző okok és problémák között, amelyek a BeanCreationException tavasszal, valamint egy jó megértés arról, hogyan lehet ezeket a problémákat megoldani.

Az összes kiviteli példa megvalósítása megtalálható a github projektben - ez egy Eclipse alapú projekt, ezért könnyen importálhatónak és futtathatónak kell lennie.