2010-07-10 11 views
5

zacząłem uczyć wiosna od wiosny odniesienia 3.0 i chciałem spróbować jak instancję wewnętrzną Fasola:Niezastosowanie się do tworzenia Innerbean użyciu Spring - BeanInstantiationException Nie domyślny konstruktor znalazł

Oto mój kod:

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; 
    } 

} 


} 

a mój plik konfiguracyjny jest:

Kiedy próbuję odzyskać bean InnerBean Otrzymuję następujący błąd:

Wyjątek w wątku "główny" org.springframework.beans.factory.BeanCreationException: Błąd tworzenia komponentu bean o nazwie "InnerBean" zdefiniowany w ścieżce klasy resource [spring-config.xml]: Nie udało się utworzyć instancji bean; Zagnieżdżony wyjątek to org.springframework.beans.BeanInstantiationException: nie można utworzyć instancji klasy bean [com.springexample.ExampleBean $ InnerBean]: Nie znaleziono domyślnego konstruktora; Zagnieżdżony wyjątek to java.lang.NoSuchMethodException: com.springexample.ExampleBean $ InnerBean.()

Co może być problemem? Próbowałem dodać konstruktor bezargumentowy w InnerBean nadal dostaję błąd ..

Czy ktoś może mi pomóc?

Odpowiedz

21

To jedna uwaga Javy - konstruktor domyślny klas wewnętrznych nie jest konstruktorem bez arg. Ich domyślny konstruktor przyjmuje 1 parametr typu - klasa zewnętrzna.

więc używać <constructor-arg> przekazać fasoli typu ExampleBean

Oczywiście używać non-statyczne klasy wewnętrzne tylko jeśli jest to konieczne. Jeśli klasa jest tylko tym, co pokazałeś, zrób to static. Lub przenieś go do nowego pliku. Wtedy nie będziesz mieć powyższego ograniczenia. Preferowanie klas statycznych jest dobrą praktyką nie tylko dla fasoli szparagowej, ale ogólnie dla Javy.

+0

Dzięki Bozho..it działa teraz .. Dzięki za twój czas – javanoob

+1

@javanerd jeśli odpowiedź ci odpowiada , zaznacz to jako zaakceptowane (zaznacz poniżej licznika głosów) – Bozho

+1

dzięki Bozho. Świetna odpowiedź. Pomogło mi to wytworzyć wewnętrzny gwint od wiosny. – Ankit

1

Nie uwzględniłeś swojego wiosennego pliku XML, ale nie sądzę, aby miało to znaczenie.

To nie działa, ponieważ InnerBean jest klasą wewnętrzną. Nie można utworzyć instancji w ten sposób, ponieważ nie byłoby żadnego załączającego wystąpienia ExampleBean. (Spróbuj zrobić new InnerBean() w Javie, a zobaczysz problem.)

Jeśli instancja InnerBean nie muszą być obudowane wewnątrz instancji ExampleBean, można zrobić InnerBean statyczne. Wtedy będziesz mógł utworzyć instancję za pomocą Spring. Lub możesz uczynić InnerBean klasą najwyższego poziomu (tj. Niezagnieżdżoną).

Jeśli chcesz dowiedzieć się więcej o klasach wewnętrznych, zobacz artykuł Nested Classes w samouczkach języka Java.

+0

Dzięki Richard za link .. Myślę, że muszę odświeżyć moje podstawy .. Dzięki za ur czas i link – javanoob

Powiązane problemy