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.