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.


$config[zx-auto] not found$config[zx-overlay] not found