Spring BeanCreationException
1. Pregled
U ovom članku raspravljamo o Proljeće org.springframework.beans.factory.BeanCreationException - ovo je vrlo česta iznimka izbačena kada BeanFactory stvara grah definicija graha i nailazi na problem. Članak će raspraviti o najčešćim uzrocima ove iznimke zajedno s rješenjem.
2. Uzrok: org.springframework.beans.factory.NoSuchBeanDefinitionException
Daleko najčešći uzrok BeanCreationException pokušava proljeće ubrizgajte grah koji ne postoji u kontekstu.
Na primjer, GrahA pokušava ubrizgati BeanB:
@Component javna klasa BeanA {@Automobilna privatna ovisnost BeanB-a; ...}
Ako je a BeanB nije pronađen u kontekstu, tada će se pojaviti sljedeća iznimka (pogreška pri stvaranju graha):
Pogreška pri stvaranju graha s imenom 'beanA': Umetanje automatski ožičenih ovisnosti nije uspjelo; ugniježđena iznimka je org.springframework.beans.factory.BeanCreationException: Nije moguće automatsko povezivanje polja: private com.baeldung.web.BeanB cpm.baeldung.web.BeanA.dependency; ugniježđena iznimka je org.springframework.beans.factory.NoSuchBeanDefinitionException: Nije pronađen nijedan kvalificirani grah tipa [com.baeldung.web.BeanB] za ovisnost: očekuje se najmanje 1 grah koji se kvalificira kao kandidat automatske žice za ovu ovisnost. Bilješke o ovisnosti: {@ org.springframework.beans.factory.annotation.Autowired (obavezno = true)}
Da biste dijagnosticirali ovu vrstu problema - prvo provjerite je li grah deklariran:
- bilo u XML konfiguracijskoj datoteci pomoću element
- ili u Javi @Konfiguracija razred putem @Grah bilješka
- ili je označeno sa: @Komponenta, @ Repozitorij, @Servis, @Controller i za taj je paket aktivno skeniranje putova
Također provjerite jesu li Spring konfiguracijske datoteke ili klase zapravo pokupili i učitali u glavni kontekst.
3. Uzrok: org.springframework.beans.factory.NoUniqueBeanDefinitionException
Još jedan sličan uzrok iznimke stvaranja graha je Spring koji pokušava ubrizgati grah po tipu - naime po njegovom sučelju - i pronalasku dva ili više graha koji implementiraju to sučelje u kontekstu.
Na primjer, GrahB1 i GrahB2 oba implementiraju isto sučelje:
@Component public class BeanB1 implementira IBeanB {...} @Component public class BeanB2 implements IBeanB {...} @Component public class BeanA {@Autowired private IBeanB dependency; ...}
To će dovesti do slijedeće iznimke koju će izbaciti tvornica graha Spring:
Pogreška pri stvaranju graha s imenom 'beanA': Umetanje automatski ožičenih ovisnosti nije uspjelo; ugniježđena iznimka je org.springframework.beans.factory.BeanCreationException: Nije moguće automatsko povezivanje polja: private com.baeldung.web.IBeanB com.baeldung.web.BeanA.b; ugniježđena iznimka je org.springframework.beans.factory.NoUniqueBeanDefinitionException: Nije definiran kvalificirajući grah tipa [com.baeldung.web.IBeanB]: očekuje se jedan odgovarajući grah, ali pronađen 2: beanB1, beanB2
4. Uzrok: org.springframework.beans.BeanInstantiationException
4.1. Prilagođena iznimka
Sljedeći je na redu a grah koji tijekom postupka stvaranja donosi iznimku; pojednostavljeni uzorak za jednostavno predstavljanje i razumijevanje problema ubacivanje iznimke u konstruktor graha:
@Component javna klasa BeanA {public BeanA () {super (); baci novi NullPointerException (); } ...}
Kao što se očekivalo, ovo će dovesti do brzog propadanja proljeća sa sljedećom iznimkom:
Pogreška pri stvaranju graha s imenom 'beanA' definiranim u datoteci [... BeanA.class]: Instanciranje graha nije uspjelo; ugniježđena iznimka je org.springframework.beans.BeanInstantiationException: Nije moguće instancirati klasu graha [com.baeldung.web.BeanA]: Konstruktor je bacio iznimku; ugniježđena iznimka je java.lang.NullPointerException
4.2. java.lang.InstantiationException
Još jedna moguća pojava BeanInstantiationException definira apstraktnu klasu kao grah u XML-u; ovo mora biti u XML-u, jer to ne postoji u datoteci Java @Configuration, a skeniranje putova klase zanemarit će apstraktnu klasu:
@Component javni sažetak klase BeanA implementira IBeanA {...}
I XML definicija graha:
Ova postavka rezultirat će sličnom iznimkom:
org.springframework.beans.factory.BeanCreationException: Pogreška pri stvaranju graha s imenom 'beanA' definiranim u resursu puta klase [beansInXml.xml]: Instanciranje graha nije uspjelo; ugniježđena iznimka je org.springframework.beans.BeanInstantiationException: Nije moguće instancirati klasu graha [com.baeldung.web.BeanA]: Je li to apstraktna klasa ?; ugniježđena iznimka je java.lang.InstantiationException
4.3. java.lang.NoSuchMethodException
Ako grah nema zadani konstruktor, a Spring ga pokuša instancirati tražeći taj konstruktor, to će rezultirati izuzećem tijekom izvođenja; na primjer:
@Component public class BeanA implementira IBeanA {public BeanA (final String name) {super (); System.out.println (ime); }}
Kada mehanizam za skeniranje putova klase pokupi ovaj grah, kvar će biti:
Pogreška pri stvaranju graha s imenom 'beanA' definiranim u datoteci [... BeanA.class]: Instanciranje graha nije uspjelo; ugniježđena iznimka je org.springframework.beans.BeanInstantiationException: Nije moguće instancirati klasu graha [com.baeldung.web.BeanA]: Nije pronađen zadani konstruktor; ugniježđena iznimka je java.lang.NoSuchMethodException: com.baeldung.web.BeanA. ()
Slična se iznimka, ali koju je teže dijagnosticirati, može dogoditi kada proljetne ovisnosti o putu predavanja nemaju ista verzija; ova vrsta nekompatibilnosti verzije može rezultirati a NoSuchMethodException zbog promjena API-ja. Rješenje takvog problema je osigurati da sve proljetne knjižnice imaju potpuno istu verziju u projektu.
5. Uzrok: org.springframework.beans.NotWritablePropertyException
Još jedna mogućnost je definiranje graha - GrahA - s referencom na drugi grah - BeanB - bez odgovarajuće metode postavljanja u GrahA:
@Component javna klasa BeanA {private IBeanB ovisnost; ...} @Component javna klasa BeanB implementira IBeanB {...}
I proljetna XML konfiguracija:
Opet, ovo može se dogoditi samo u XML konfiguraciji, jer kada se koristi Java @Konfiguracija, prevodilac će onemogućiti reprodukciju ovog broja.
Naravno, da bi se riješio ovaj problem, treba dodati setter za IBeanB:
@Component javna klasa BeanA {private IBeanB ovisnost; javna praznina setDependency (konačna ovisnost IBeanB) {this.dependency = ovisnost; }}
6. Uzrok: org.springframework.beans.factory.CannotLoadBeanClassException
Ova se iznimka baca kada Opruga ne može učitati klasu definiranog graha - to se može dogoditi ako Spring XML Configuration sadrži grah koji jednostavno nema odgovarajuću klasu. Na primjer, ako klasa BeanZ ne postoji, sljedeća definicija rezultirat će iznimkom:
Glavni uzrok ako ClassNotFoundException i puna iznimka u ovom slučaju je:
ugniježđeni izuzetak je org.springframework.beans.factory.BeanCreationException: ... ugniježđeni izuzetak je org.springframework.beans.factory.CannotLoadBeanClassException: Ne mogu pronaći klasu [com.baeldung.web.BeanZ] za grah definiran u nazivu 'beanZ' resurs puta klase [grahInXml.xml]; ugniježđena iznimka je java.lang.ClassNotFoundException: com.baeldung.web.BeanZ
7. Djeca od BeanCreationException
7.1. The org.springframework.beans.factory.BeanCurrentlyInCreationException
Jedna od potklasa BeanCreationException je BeanCurrentlyInCreationException; to se obično događa kada se koristi ubrizgavanje konstruktora - na primjer, u slučaju kružnih ovisnosti:
@Component public class BeanA implementira IBeanA {private IBeanB beanB; @Autowired javni BeanA (konačni IBeanB beanB) {super (); this.beanB = grahB; }} @Component javna klasa BeanB implementira IBeanB {final IBeanA beanA; @Autowired javni BeanB (konačni IBeanA beanA) {super (); this.beanA = grahA; }}
Proljeće neće moći riješiti ovakav scenarij ožičenja, a krajnji rezultat će biti:
org.springframework.beans.factory.BeanCurrentlyInCreationException: Pogreška pri stvaranju graha s imenom 'beanA': Traženi grah je trenutno u izradi: Postoji li nerješiva kružna referenca?
Potpuna je iznimka vrlo opširna:
org.springframework.beans.factory.UnsatisfiedDependencyException: Pogreška pri stvaranju graha s imenom 'beanA' definiranim u datoteci [... BeanA.class]: Nezadovoljna ovisnost izražena argumentom konstruktora s indeksom 0 tipa [com.baeldung.web.IBeanB] :: Pogreška u stvaranju graha s imenom 'beanB' definiranim u datoteci [... BeanB.class]: Nezadovoljna ovisnost izražena kroz argument konstruktora s indeksom 0 tipa [com.baeldung.web.IBeanA]:: Pogreška pri stvaranju graha s imenom ' beanA ': Traženi grah je trenutno u izradi: Postoji li nerješiva kružna referenca ?; ugniježđena iznimka je org.springframework.beans.factory.BeanCurrentlyInCreationException: Pogreška pri stvaranju graha s imenom 'beanA': Traženi grah je trenutno u izradi: Postoji li nerješiva kružna referenca ?; ugniježđena iznimka je org.springframework.beans.factory.UnsatisfiedDependencyException: Pogreška pri stvaranju graha s imenom 'beanB' definiranim u datoteci [... BeanB.class]: Nezadovoljna ovisnost izražena argumentom konstruktora s indeksom 0 tipa [com.baeldung.web .IBeanA]:: Pogreška pri stvaranju graha s imenom 'beanA': Traženi grah je trenutno u izradi: Postoji li nerješiva kružna referenca ?; ugniježđena iznimka je org.springframework.beans.factory.BeanCurrentlyInCreationException: Pogreška pri stvaranju graha s imenom 'beanA': Traženi grah je trenutno u izradi: Postoji li nerješiva kružna referenca?
7.2. The org.springframework.beans.factory.BeanIsAbstractException
Ova iznimka instanciranja može se dogoditi kada tvornica zrna graha pokušava dohvatiti i instancirati zrno graha koje je proglašeno apstraktnim; na primjer:
javna apstraktna klasa BeanA implementira IBeanA {...}
Deklarirano u XML konfiguraciji kao:
Ako pokušamo dohvatiti GrahA iz proljetnog konteksta po imenu - na primjer kod instanciranja drugog graha:
@Configuration javna klasa Config {@Autowired BeanFactory beanFactory; @Bean public BeanB beanB () {beanFactory.getBean ("beanA"); vrati novi BeanB (); }}
To će rezultirati sljedećom iznimkom:
org.springframework.beans.factory.BeanIsAbstractException: Pogreška pri stvaranju graha s imenom 'beanA': Definicija graha je apstraktna
I puni stacktrace izuzetaka:
org.springframework.beans.factory.BeanCreationException: Pogreška pri stvaranju graha s imenom 'beanB' definiranim u resursu puta klase [org / baeldung / spring / config / WebConfig.class]: Instantiranje graha nije uspjelo; ugniježđena iznimka je org.springframework.beans.factory.BeanDefinitionStoreException: Tvornička metoda [public com.baeldung.web.BeanB com.baeldung.spring.config.WebConfig.beanB ()] bačena iznimka; ugniježđena iznimka je org.springframework.beans.factory.BeanIsAbstractException: Pogreška pri stvaranju graha s imenom 'beanA': Definicija graha je apstraktna
8. Zaključak
Na kraju ovog članka trebali bismo imati jasnu mapu za kretanje kroz razne uzroke i probleme koji mogu dovesti do BeanCreationException u proljeće, kao i dobar uvid u to kako riješiti sve ove probleme.
Primjenu svih primjera iznimki možete pronaći u projektu github - ovo je projekt zasnovan na Eclipseu, pa bi ga trebalo lako uvesti i pokrenuti kakav jest.