2010-07-10 7 views
5

fand ich begann Frühjahr von Spring 3.0 Referenz Lernen und ich wollte versuchen, wie innere Bohne zu instanziiert:Failing Innerbean mit Spring erstellen - BeanInstantiationException Kein Standardkonstruktor

Hier ist mein Code:

package com.springexample; 

public class ExampleBean { 

private String samplePropertyExampleBean; 

public void setSamplePropertyExampleBean(String samplePropertyExampleBean) { 
    this.samplePropertyExampleBean = samplePropertyExampleBean; 
} 

public String getSamplePropertyExampleBean() { 
    return samplePropertyExampleBean; 
} 

class InnerBean{ 

    private String sampleProperty; 

    public void setSampleProperty(String sampleProperty) { 
    this.sampleProperty = sampleProperty; 
    } 

    public String getSampleProperty() { 
    return sampleProperty; 
    } 

} 


} 

und meine Config-Datei ist:

Wenn ich versuche, die zum abrufen Bean InnerBean Ich erhalte folgenden Fehler:

Ausnahme im Thread "Haupt" org.springframework.beans.factory.BeanCreationException: Fehler beim Erstellen Bean mit Name 'InnerBean' in Klassenpfad Ressource [Spring-config.xml] definiert: Instanziierung von Bean fehlgeschlagen; verschachtelte Ausnahme ist org.springframework.beans.BeanInstantiationException: Bean-Klasse konnte nicht instanziiert werden [com.springexample.ExampleBean $ InnerBean]: Kein Standardkonstruktor gefunden; verschachtelte Ausnahme ist java.lang.NoSuchMethodException: com.springexample.ExampleBean $ InnerBean.()

Was könnte das Problem sein? Ich versuchte, No-Argument-Konstruktor in der InnerBean hinzufügen, immer noch bekomme ich Fehler ..

Kann mir jemand helfen?

Antwort

21

Das ist ein Vorbehalt von Java - innere Klassen Standardkonstruktor ist kein no-Arg-Konstruktor. Ihr Standardkonstruktor nimmt 1 Parameter des Typs - die äußere Klasse.

So verwenden <constructor-arg> eine Bohne vom Typ ExampleBean

Natürlich zu übergeben, verwendet nicht-statische innere Klassen nur dann, wenn dies erforderlich ist. Wenn die Klasse nur das ist, was Sie gezeigt haben, dann machen Sie es static. Oder verschiebe es in eine neue Datei. Dann haben Sie die obige Einschränkung nicht. Das Vorziehen von statischen inneren Klassen ist nicht nur für Spring Beans, sondern generell für Java eine gute Übung.

+0

Danke Bozho..it arbeitet jetzt..Danke für Ihre Zeit – javanoob

+1

@javanerd, wenn die Antwort Ihnen passt , markieren Sie es als akzeptiert (kreuzen Sie unter dem Stimmzähler) – Bozho

+1

danke Bozho. Gute Antwort. Es half mir, einen inneren Faden aus dem Frühling zu erzeugen. – Ankit

1

Sie haben Ihre Spring XML-Datei nicht eingeschlossen, aber ich glaube nicht, dass sie eine Rolle spielt.

Es funktioniert nicht, weil InnerBean eine innere Klasse ist. Es kann auf diese Weise nicht instanziiert werden, da es keine umschließende Instanz von ExampleBean geben würde. (Versuchen Sie new InnerBean() in Java zu tun, und Sie werden das Problem sehen.)

Wenn ein InnerBean Instanz muss nicht innerhalb einer ExampleBean Instanz gekapselt werden, könnten Sie InnerBean statisch machen. Dann könnten Sie es mit Spring instanziieren. Oder Sie könnten InnerBean eine Klasse der obersten Ebene (d. H. Nicht verschachtelt) machen.

Weitere Informationen zu inneren Klassen finden Sie in den Java-Lernprogrammen unter Nested Classes.

+0

Danke Richard für den Link..Ich denke, ich muss meine Grundlagen..Vielen Dank für Ihre Zeit & Link – javanoob

Verwandte Themen