Jarná výnimka BeanCreation
1. Prehľad
V tomto článku diskutujeme o Jar org.springframework.beans.factory.BeanCreationException - toto je veľmi častá výnimka vyvolaná, keď BeanFactory vytvára fazuľa z fazuľových definícií a naráža na problém. V článku sa bude diskutovať o najbežnejších príčinách tejto výnimky spolu s riešením.
2. Príčina: org.springframework.beans.factory.NoSuchBeanDefinitionException
Zďaleka najbežnejšia príčina BeanCreationException snaží sa jar vstreknite fazuľa, ktorá neexistuje v kontexte.
Napríklad, BeanA sa snaží podať injekciu BeanB:
@ Komponent verejná trieda BeanA {@Autowired súkromná závislosť BeanB; ...}
Ak BeanB sa nenájde v kontexte, bude vyvolaná nasledujúca výnimka (Chyba pri vytváraní fazule):
Chyba pri vytváraní fazule s názvom 'beanA': Injekcia závislostí s automatickým pripojením zlyhala; vnorenou výnimkou je org.springframework.beans.factory.BeanCreationException: Nepodarilo sa pole autowire: private com.baeldung.web.BeanB cpm.baeldung.web.BeanA.dependency; vnorenou výnimkou je org.springframework.beans.factory.NoSuchBeanDefinitionException: pre závislosť sa nenašiel žiadny kvalifikačný fazuľa typu [com.baeldung.web.BeanB]: očakáva sa minimálne 1 fazuľa, ktorá sa kvalifikuje ako kandidát autowire pre túto závislosť. Poznámky k závislosti: {@ org.springframework.beans.factory.annotation.Autowired (required = true)}
Ak chcete diagnostikovať tento typ problému - najskôr sa uistite, či je fazuľa deklarovaná:
- buď v konfiguračnom súbore XML pomocou element
- alebo v prostredí Java @ Konfigurácia triedy cez @Bean anotácia
- alebo je anotovaný: @ Komponent, @Úložisko, @Služba, @ Kontrolór a pre tento balík je aktívne skenovanie triedy
Skontrolujte tiež, či konfiguračné súbory alebo triedy skutočne Spring zachytil a načítal do hlavného kontextu.
3. Príčina: org.springframework.beans.factory.NoUniqueBeanDefinitionException
Ďalšou podobnou príčinou výnimky pri vytváraní fazule je Spring, ktorá sa snaží vstreknúť fazuľu podľa typu - konkrétne podľa jej rozhrania - a nájdenia dve alebo viac zŕn implementujúcich toto rozhranie v kontexte.
Napríklad, BeanB1 a BeanB2 oba implementujú rovnaké rozhranie:
@Component public class BeanB1 implementuje IBeanB {...} @Component public class BeanB2 implementuje IBeanB {...} @Component public class BeanA {@Autowired private IBeanB dependency; ...}
To povedie k tomu, že továreň na výrobu fazule Spring vyvolá nasledujúcu výnimku:
Chyba pri vytváraní fazule s názvom 'beanA': Injekcia závislostí s automatickým pripojením zlyhala; vnorenou výnimkou je org.springframework.beans.factory.BeanCreationException: Nepodarilo sa pole autowire: private com.baeldung.web.IBeanB com.baeldung.web.BeanA.b; vnorenou výnimkou je org.springframework.beans.factory.NoUniqueBeanDefinitionException: nie je definovaná žiadna kvalifikovaná fazuľa typu [com.baeldung.web.IBeanB]: očakáva sa, že sa zhoduje jedna fazuľa, ale našla sa 2: beanB1, beanB2
4. Príčina: org.springframework.beans.BeanInstantiationException
4.1. Vlastná výnimka
Ďalším v poradí je a fazuľa, ktorá počas procesu vytvárania hodí výnimku; zjednodušená vzorka, ktorá slúži na ilustráciu a pochopenie problému, predstavuje výnimku v konštruktore fazule:
@ Komponent public class BeanA {public BeanA () {super (); hodiť novú NullPointerException (); } ...}
Podľa očakávania to povedie k rýchlemu zlyhaniu jari s nasledujúcou výnimkou:
Chyba pri vytváraní fazule s názvom „beanA“ definovaným v súbore [... BeanA.class]: Instantácia fazule zlyhala; vnorenou výnimkou je org.springframework.beans.BeanInstantiationException: Nepodarilo sa vytvoriť inštanciu triedy bean [com.baeldung.web.BeanA]: Konštruktér vyhodil výnimku; vnorenou výnimkou je java.lang.NullPointerException
4.2. java.lang.InstantiationException
Ďalším možným výskytom BeanInstantiationException definuje abstraktnú triedu ako bean v XML; toto musí byť v XML, pretože v súbore Java @Configuration to nie je možné urobiť a skenovanie triedy classpath bude ignorovať abstraktnú triedu:
@ Verejná abstraktná trieda komponentu BeanA implementuje IBeanA {...}
A XML definícia fazule:
Výsledkom tohto nastavenia bude podobná výnimka:
org.springframework.beans.factory.BeanCreationException: Chyba pri vytváraní fazule s názvom 'beanA' definovaným v prostriedku cesty triedy [beanInXml.xml]: Instantácia fazule zlyhala; vnorenou výnimkou je org.springframework.beans.BeanInstantiationException: Nepodarilo sa vytvoriť inštanciu triedy bean [com.baeldung.web.BeanA]: je to abstraktná trieda ?; vnorenou výnimkou je java.lang.InstantiationException
4.3. java.lang.NoSuchMethodException
Ak bean nemá predvoleného konštruktora a Spring sa ho pokúsi vytvoriť inštanciou hľadaním tohto konštruktora, bude to mať za následok runtime výnimku; napríklad:
@Component public class BeanA implementuje IBeanA {public BeanA (konečný názov reťazca) {super (); System.out.println (názov); }}
Keď sa táto fazuľa zachytí mechanizmom skenovania cesty k triede, zlyhanie bude:
Chyba pri vytváraní fazule s názvom „beanA“ definovaným v súbore [... BeanA.class]: Instantácia fazule zlyhala; vnorenou výnimkou je org.springframework.beans.BeanInstantiationException: Nepodarilo sa vytvoriť inštanciu triedy bean [com.baeldung.web.BeanA]: Nebol nájdený žiadny predvolený konštruktor; vnorenou výnimkou je java.lang.NoSuchMethodException: com.baeldung.web.BeanA. ()
Podobná výnimka, ktorá sa diagnostikuje ťažšie, sa môže vyskytnúť, keď jarné závislosti na triednej ceste nemajú rovnaká verzia; tento druh nekompatibility verzie môže mať za následok a NoSuchMethodException z dôvodu zmien API. Riešením takéhoto problému je zabezpečiť, aby všetky jarné knižnice mali v projekte úplne rovnakú verziu.
5. Príčina: org.springframework.beans.NotWritablePropertyException
Ešte jedna možnosť definuje fazuľu - BeanA - s odkazom na inú fazuľu - BeanB - bez príslušnej metódy nastavenia v systéme Windows BeanA:
@ Komponent verejná trieda BeanA {súkromná závislosť IBeanB; ...} @Component public class BeanB implementuje IBeanB {...}
A jarná konfigurácia XML:
Opäť toto sa môže vyskytnúť iba v konfigurácii XML, pretože pri použití Java @ Konfigurácia, kompilátor znemožní reprodukciu tohto čísla.
Pre vyriešenie tohto problému je samozrejme potrebné pridať setra pre IBeanB:
@ Komponent verejná trieda BeanA {súkromná závislosť IBeanB; public void setDependency (konečná závislosť IBeanB) {this.dependency = závislosť; }}
6. Príčina: org.springframework.beans.factory.CannotLoadBeanClassException
Táto výnimka je vyvolaná, keď Jar nemôže načítať triedu definovanej fazule - toto sa môže vyskytnúť, ak jarná XML konfigurácia obsahuje fazuľu, ktorá jednoducho nemá zodpovedajúcu triedu. Napríklad ak trieda BeanZ neexistuje, nasledujúca definícia bude mať za následok výnimku:
Hlavná príčina, ak ClassNotFoundException a úplná výnimka v tomto prípade je:
vnorená výnimka je org.springframework.beans.factory.BeanCreationException: ... vnorená výnimka je org.springframework.beans.factory.CannotLoadBeanClassException: Nie je možné nájsť triedu [com.baeldung.web.BeanZ] pre fazuľu s názvom „beanZ“ definovaným v prostriedok cesty triedy [beanInXml.xml]; vnorenou výnimkou je java.lang.ClassNotFoundException: com.baeldung.web.BeanZ
7. Deti z BeanCreationException
7.1. The org.springframework.beans.factory.BeanCurrentlyInCreationException
Jedna z podtried triedy BeanCreationException je BeanCurrentlyInCreationException; k tomu obvykle dochádza pri použití injektora konštruktora - napríklad v prípade kruhových závislostí:
@ Komponent public class BeanA implementuje IBeanA {private IBeanB beanB; @Autowired public BeanA (final IBeanB beanB) {super (); this.beanB = beanB; }} @ Verejná zložka komponentu BeanB implementuje IBeanB {final IBeanA beanA; @Autowired public BeanB (final IBeanA beanA) {super (); this.beanA = beanA; }}
Jar nebude schopná vyriešiť tento druh scenára zapojenia a konečným výsledkom bude:
org.springframework.beans.factory.BeanCurrentlyInCreationException: Chyba pri vytváraní fazule s názvom 'beanA': Požadovaná fazuľa sa momentálne vytvára: Existuje nevyriešiteľný kruhový odkaz?
Úplná výnimka je veľmi podrobná:
org.springframework.beans.factory.UnsatisfiedDependencyException: Chyba pri vytváraní fazule s názvom „beanA“ definovaným v súbore [... BeanA.class]: Neuspokojená závislosť vyjadrená argumentom konštruktora s indexom 0 typu [com.baeldung.web.IBeanB] :: Chyba pri vytváraní fazule s názvom 'beanB' definovaným v súbore [... BeanB.class]: Neuspokojená závislosť vyjadrená argumentom konštruktora s indexom 0 typu [com.baeldung.web.IBeanA]:: Chyba pri vytváraní fazule s menom ' beanA ': Požadovaný objekt bean sa práve vytvára: Existuje nevyriešiteľný kruhový odkaz ?; vnorenou výnimkou je org.springframework.beans.factory.BeanCurrentlyInCreationException: Chyba pri vytváraní fazule s názvom „beanA“: Požadovaná fazuľa sa práve vytvára: Existuje nevyriešiteľný kruhový odkaz ?; vnorenou výnimkou je org.springframework.beans.factory.UnsatisfiedDependencyException: Chyba pri vytváraní fazule s názvom „beanB“ definovaným v súbore [... BeanB.class]: Nespokojná závislosť vyjadrená argumentom konštruktora s indexom 0 typu [com.baeldung.web .IBeanA]:: Chyba pri vytváraní fazule s názvom 'beanA': Požadovaná fazuľa sa práve vytvára: Existuje nevyriešiteľný kruhový odkaz ?; vnorenou výnimkou je org.springframework.beans.factory.BeanCurrentlyInCreationException: Chyba pri vytváraní fazule s názvom „beanA“: Požadovaná fazuľa sa práve vytvára: Existuje nevyriešiteľný kruhový odkaz?
7.2. The org.springframework.beans.factory.BeanIsAbstractException
Táto výnimka inštancie sa môže vyskytnúť, keď sa Bean Factory pokúsi načítať a vytvoriť inštanciu fazule, ktorá bola vyhlásená za abstraktnú; napríklad:
verejná abstraktná trieda BeanA implementuje IBeanA {...}
Deklarované v konfigurácii XML ako:
Teraz, ak sa o to pokúsime načítať BeanA z jarného kontextu podľa názvu - napríklad pri vytváraní inštancie iného zrna:
@ Konfigurácia verejná trieda Konfigurácia {@Autowired BeanFactory beanFactory; @Bean public BeanB beanB () {beanFactory.getBean ("beanA"); vrátiť nový BeanB (); }}
Bude to mať za následok nasledujúcu výnimku:
org.springframework.beans.factory.BeanIsAbstractException: Chyba pri vytváraní fazule s názvom „beanA“: definícia fazule je abstraktná
A úplná výnimka stacktrace:
org.springframework.beans.factory.BeanCreationException: Chyba pri vytváraní fazule s názvom 'beanB' definovaným v prostriedku cesty triedy [org / baeldung / spring / config / WebConfig.class]: Instantácia fazule zlyhala; vnorenou výnimkou je org.springframework.beans.factory.BeanDefinitionStoreException: továrenská metóda [public com.baeldung.web.BeanB com.baeldung.spring.config.WebConfig.beanB ()] hodila výnimku; vnorenou výnimkou je org.springframework.beans.factory.BeanIsAbstractException: Chyba pri vytváraní fazule s názvom „beanA“: definícia fazule je abstraktná
8. Záver
Na konci tohto článku by sme mali mať jasnú mapu, aby sme sa zorientovali v rôznych príčinách a problémoch, ktoré môžu viesť k a BeanCreationException na jar, ako aj dobrý prehľad o tom, ako vyriešiť všetky tieto problémy.
Implementáciu všetkých príkladov výnimiek možno nájsť v projekte github - jedná sa o projekt založený na Eclipse, takže by malo byť ľahké ho importovať a spustiť tak, ako je.