Spring BeanCreationException

1. Oversikt

I denne artikkelen diskuterer vi Vår org.springframework.beans.factory.BeanCreationException - dette er et veldig vanlig unntak som kastes når BeanFactory skaper bønner av bønnedefinisjonene og støter på et problem. Artikkelen vil diskutere de vanligste årsakene til dette unntaket sammen med løsningen.

2. Årsak: org.springframework.beans.factory.NoSuchBeanDefinitionException

Den klart vanligste årsaken til BeanCreationException prøver våren å injiser en bønne som ikke eksisterer i konteksten.

For eksempel, BeanA prøver å injisere BeanB:

@Komponent offentlig klasse BeanA {@Autowired privat BeanB avhengighet; ...}

Hvis en BeanB ikke blir funnet i sammenhengen, blir følgende unntak kastet (Error Creating Bean):

Feil ved oppretting av bønne med navnet 'beanA': Injiseringen av autowired avhengigheter mislyktes; nestet unntak er org.springframework.beans.factory.BeanCreationException: Kunne ikke autowire felt: privat com.baeldung.web.BeanB cpm.baeldung.web.BeanA.dependency; nestet unntak er org.springframework.beans.factory.NoSuchBeanDefinitionException: Ingen kvalifiserende bønner av typen [com.baeldung.web.BeanB] funnet for avhengighet: forventet minst 1 bønne som kvalifiserer som autowire-kandidat for denne avhengigheten. Avhengighetsanmerkninger: {@ org.springframework.beans.factory.annotation.Autowired (required = true)}

For å diagnostisere denne typen problemer - sørg først for at bønnen er erklært:

  • enten i en XML-konfigurasjonsfil ved hjelp av element
  • eller i en Java @Konfigurasjon klasse via @Bønne kommentar
  • eller er merket med: @Komponent, @Oppbevaringssted, @Service, @Kontrollør og klassesøk er aktivt for den pakken

Sjekk også at konfigurasjonsfilene eller klassene faktisk blir plukket opp av Spring og lastet inn i hovedkonteksten.

3. Årsak: org.springframework.beans.factory.NoUniqueBeanDefinitionException

En annen lignende årsak til unntak for bønnedannelse er at Spring prøver å injisere en bønne etter type - nemlig ved grensesnittet - og finne to eller flere bønner som implementerer det grensesnittet i konteksten.

For eksempel, BeanB1 og BeanB2 begge implementerer det samme grensesnittet:

@Komponent offentlig klasse BeanB1 implementerer IBeanB {...} @Komponent offentlig klasse BeanB2 implementerer IBeanB {...} @Komponent offentlig klasse BeanA {@Autowired privat IBeanB avhengighet; ...}

Dette vil føre til at følgende unntak blir kastet av vårbønnefabrikken:

Feil ved oppretting av bønne med navnet 'beanA': Injiseringen av autowired avhengigheter mislyktes; nestet unntak er org.springframework.beans.factory.BeanCreationException: Kunne ikke autowire felt: private com.baeldung.web.IBeanB com.baeldung.web.BeanA.b; nestet unntak er org.springframework.beans.factory.NoUniqueBeanDefinitionException: Ingen kvalifiserende bønner av typen [com.baeldung.web.IBeanB] er definert: forventet enkelt matchende bønne men funnet 2: beanB1, beanB2

4. Årsak: org.springframework.beans.BeanInstantiationException

4.1. Tilpasset unntak

Neste i køen er en bønne som kaster et unntak under opprettelsesprosessen; et forenklet utvalg for enkelt å eksemplifisere og forstå problemet, kaster et unntak i bønnens konstruktør:

@Komponent offentlig klasse BeanA {offentlig BeanA () {super (); kaste nye NullPointerException (); } ...}

Som forventet vil dette føre til at våren mislykkes raskt med følgende unntak:

Feil ved oppretting av bønne med navnet 'beanA' definert i filen [... BeanA.class]: Instantiering av bønne mislyktes. nestet unntak er org.springframework.beans.BeanInstantiationException: Kunne ikke instantiere bønneklasse [com.baeldung.web.BeanA]: Constructor kastet unntak; nestet unntak er java.lang.NullPointerException

4.2. java.lang.InstantiationException

En annen mulig forekomst av BeanInstantiationException definerer en abstrakt klasse som en bønne i XML; dette må være i XML, fordi det ikke er noen måte å gjøre dette i en Java @Configuration-fil, og skanning av klassesti vil ignorere den abstrakte klassen:

@Komponent offentlig abstrakt klasse BeanA implementerer IBeanA {...}

Og XML-definisjonen av bønnen:

Dette oppsettet vil resultere i et lignende unntak:

org.springframework.beans.factory.BeanCreationException: Feil ved oppretting av bønne med navnet 'beanA' definert i klassen bane ressurs [beansInXml.xml]: Instantiering av bønne mislyktes; nestet unntak er org.springframework.beans.BeanInstantiationException: Kunne ikke instantiere bønneklassen [com.baeldung.web.BeanA]: Er det en abstrakt klasse ?; nestet unntak er java.lang.InstantiationException

4.3. java.lang.NoSuchMethodException

Hvis en bønne ikke har noen standardkonstruktør, og Spring prøver å starte den ved å lete etter den konstruktøren, vil dette resultere i et unntak for kjøretid; for eksempel:

@Komponent offentlig klasse BeanA implementerer IBeanA {offentlig BeanA (endelig strengnavn) {super (); System.out.println (navn); }}

Når denne bønnen blir plukket opp av classpath-skannemekanismen, vil feilen være:

Feil ved oppretting av bønne med navnet 'beanA' definert i filen [... BeanA.class]: Instantiering av bønne mislyktes. nestet unntak er org.springframework.beans.BeanInstantiationException: Kunne ikke instantiere bønneklasse [com.baeldung.web.BeanA]: Ingen standardkonstruktører funnet; nestet unntak er java.lang.NoSuchMethodException: com.baeldung.web.BeanA. ()

Et lignende unntak, men vanskeligere å diagnostisere, kan oppstå når våravhengighetene på klassestien ikke har samme versjon; denne typen versjonskompatibilitet kan resultere i en NoSuchMethodException på grunn av API-endringer. Løsningen på et slikt problem er å sørge for at alle vårbibliotekene har nøyaktig samme versjon i prosjektet.

5. Årsak: org.springframework.beans.NotWritablePropertyException

Nok en mulighet er å definere en bønne - BeanA - med referanse til en annen bønne - BeanB - uten å ha den tilsvarende settermetoden i BeanA:

@Komponent offentlig klasse BeanA {privat IBeanB avhengighet; ...} @Komponent offentlig klasse BeanB implementerer IBeanB {...}

Og vårens XML-konfigurasjon:

Igjen, dette kan bare forekomme i XML-konfigurasjon, fordi når du bruker Java @Konfigurasjonvil kompilatoren gjøre dette problemet umulig å reprodusere.

Selvfølgelig, for å løse dette problemet, må setteren legges til for IBeanB:

@Komponent offentlig klasse BeanA {privat IBeanB avhengighet; public void setDependency (final IBeanB avhengighet) {this.dependency = avhengighet; }}

6. Årsak: org.springframework.beans.factory.CannotLoadBeanClassException

Dette unntaket kastes når Våren kan ikke laste klassen til den definerte bønnen - Dette kan skje hvis vår XML-konfigurasjon inneholder en bønne som ganske enkelt ikke har en tilsvarende klasse. For eksempel hvis klasse BeanZ ikke eksisterer, vil følgende definisjon resultere i et unntak:

Grunnen til at hvis ClassNotFoundException og det fulle unntaket i dette tilfellet er:

nestet unntak er org.springframework.beans.factory.BeanCreationException: ... nestet unntak er org.springframework.beans.factory.CannotLoadBeanClassException: Kan ikke finne klasse [com.baeldung.web.BeanZ] for bønne med navnet 'beanZ' definert i klasse sti ressurs [beansInXml.xml]; nestet unntak er java.lang.ClassNotFoundException: com.baeldung.web.BeanZ

7. Barn av BeanCreationException

7.1. De org.springframework.beans.factory.BeanCurrentlyInCreationException

En av underklassene til BeanCreationException er den BeanCurrentlyInCreationException; dette skjer vanligvis når du bruker konstruktørinjeksjon - for eksempel i tilfelle sirkulære avhengigheter:

@Komponent offentlig klasse BeanA implementerer IBeanA {privat IBeanB beanB; @Autowired public BeanA (final IBeanB beanB) {super (); this.beanB = beanB; }} @Komponent offentlig klasse BeanB implementerer IBeanB {final IBeanA beanA; @Autowired public BeanB (final IBeanA beanA) {super (); this.beanA = beanA; }}

Våren vil ikke kunne løse denne typen koblingsscenario, og sluttresultatet blir:

org.springframework.beans.factory.BeanCurrentlyInCreationException: Feil ved oppretting av bønne med navnet 'beanA': Forespurt bønne er for øyeblikket under opprettelse: Er det en uløselig sirkulær referanse?

Hele unntaket er veldig ordentlig:

org.springframework.beans.factory.UnsatisfiedDependencyException: Feil ved oppretting av bønne med navnet 'beanA' definert i filen [... BeanA.class]: Mislykket avhengighet uttrykt gjennom konstruktørargument med indeks 0 av typen [com.baeldung.web.IBeanB] :: Feil ved oppretting av bønne med navnet 'beanB' definert i filen [... BeanB.class]: Mislykket avhengighet uttrykt gjennom konstruktørargument med indeks 0 av typen [com.baeldung.web.IBeanA]:: Feil ved oppretting av bønne med navn ' beanA ': Forespurt bønne er for tiden under opprettelse: Er det en uløselig sirkulær referanse ?; nestet unntak er org.springframework.beans.factory.BeanCurrentlyInCreationException: Feil ved oppretting av bønne med navnet 'beanA': Forespurt bønne er for øyeblikket under opprettelse: Er det en uløselig sirkulær referanse ?; nestet unntak er org.springframework.beans.factory.UnsatisfiedDependencyException: Feil ved oppretting av bønne med navnet 'beanB' definert i filen [... BeanB.class]: Mislykket avhengighet uttrykt gjennom konstruktørargument med indeks 0 av typen [com.baeldung.web .IBeanA]:: Feil ved oppretting av bønne med navnet 'beanA': Forespurt bønne er for øyeblikket under opprettelse: Er det en uløselig sirkulær referanse ?; nestet unntak er org.springframework.beans.factory.BeanCurrentlyInCreationException: Feil ved oppretting av bønne med navnet 'beanA': Forespurt bønne er for øyeblikket under opprettelse: Er det en uløselig sirkulær referanse?

7.2. De org.springframework.beans.factory.BeanIsAbstractException

Dette instantiserings unntaket kan forekomme når Bean Factory prøver å hente og instantiere en bønne som ble erklært som abstrakt; for eksempel:

offentlig abstrakt klasse BeanA implementerer IBeanA {...}

Erklært i XML-konfigurasjonen som:

Nå, hvis vi prøver å hente BeanA fra vårkonteksten ved navn - for eksempel når du starter en annen bønne:

@Configuration public class Config {@Autowired BeanFactory beanFactory; @Bean offentlig BeanB beanB () {beanFactory.getBean ("beanA"); returner nye BeanB (); }}

Dette vil resultere i følgende unntak:

org.springframework.beans.factory.BeanIsAbstractException: Feil ved oppretting av bønne med navnet 'beanA': Bønnedefinisjon er abstrakt

Og fullstendig stacktrace:

org.springframework.beans.factory.BeanCreationException: Feil ved oppretting av bønne med navnet 'beanB' definert i klassebane ressurs [org / baeldung / spring / config / WebConfig.class]: Instantiering av bønne mislyktes; nestet unntak er org.springframework.beans.factory.BeanDefinitionStoreException: Factory method [public com.baeldung.web.BeanB com.baeldung.spring.config.WebConfig.beanB ()] kastet unntak; nestet unntak er org.springframework.beans.factory.BeanIsAbstractException: Feil ved oppretting av bønne med navnet 'beanA': Bønnedefinisjon er abstrakt

8. Konklusjon

På slutten av denne artikkelen bør vi ha et tydelig kart for å navigere i de mange årsakene og problemene som kan føre til a BeanCreationException om våren, samt en god forståelse av hvordan du kan løse alle disse problemene.

Implementeringen av alle eksempler på unntak finnes i github-prosjektet - dette er et formørkelsesbasert prosjekt, så det skal være enkelt å importere og kjøre som det er.


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