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.