2011-09-20 11 views
24

Nie chcę tworzyć domyślnego konstruktora dla mojej klasy auditRecord.Czy Spring wymaga, aby wszystkie komponenty bean miały domyślny konstruktor?

Ale Wiosna wydaje się nalegać na to:

org.springframework.beans.factory.BeanCreationException: 
Error creating bean with name 'auditRecord' defined in ServletContext resource 
[/WEB-INF/applicationContext.xml]: 
Instantiation of bean failed; 
nested exception is org.springframework.beans.BeanInstantiationException: 
Could not instantiate bean class [com.bartholem.AuditRecord]: 
No default constructor found; 
nested exception is 
java.security.PrivilegedActionException: 
java.lang.NoSuchMethodException: 
com.bartholem.AuditRecord 

Czy to naprawdę konieczne?

+0

Proszę pokazać swój config, który ładuje fasoli - XML ​​lub adnotacje – atrain

+0

https://stackoverflow.com/questions/25272543/no-default-constructor-found-nested-exception-is-java-lang-nosuchmethodexceptio – newday

Odpowiedz

1

Możesz być w stanie zrobić zastrzyk w oparciu konstruktora, czyli coś takiego (wzięte z dokumentacji znaleziono here)

<bean id="foo" class="x.y.Foo"> 
    <constructor-arg ref="bar"/> 
    <constructor-arg ref="baz"/> 
</bean> 

ale nie jestem pewien, że będzie działać.

Jeśli definiujesz komponent JavaBean, musisz postępować zgodnie z konwencją i umieścić na niej publiczny konstruktor no-arg.

28

Nie, nie trzeba używać konstruktorów domyślnych (bez argumentów).

Jak zdefiniowałeś swój komponent? Wygląda na to, że mógłbyś powiedzieć Springowi, żeby wytworzył twoją fasolę, coś w rodzaju:

<bean id="AuditRecord" class="com.bartholem.AuditRecord"/> 

<bean id="AnotherAuditRecord" class="com.bartholem.AuditRecord"> 
    <property name="someProperty" val="someVal"/> 
</bean> 

Gdzie nie podano argumentu konstruktora. Poprzedni użyje konstruktorów domyślnych (lub nie arg). Jeśli chcesz użyć konstruktora, które odbywają się w argumenty, trzeba podać je z elementem constructor-arg tak:

<bean id="AnotherAuditRecord" class="com.bartholem.AuditRecord"> 
    <constructor-arg val="someVal"/> 
</bean> 

Jeśli chcesz odwołać kolejną fasolkę w kontekście aplikacji, można to zrobić za pomocą ref atrybut elementu constructor-arg zamiast atrybutu val.

<bean id="AnotherAuditRecord" class="com.bartholem.AuditRecord"> 
    <constructor-arg ref="AnotherBean"/> 
</bean> 

<bean id="AnotherBean" class="some.other.Class" /> 
18

Odpowiedź Nicholas jest odpowiednia dla pieniędzy na konfigurację XML. Chciałbym tylko zwrócić uwagę, że podczas korzystania z adnotacji do skonfigurowania fasoli, to nie tylko prostsze do zrobienia zastrzyku konstruktora, jest to o wiele bardziej naturalny sposób to zrobić:

class Foo { 
    private SomeDependency someDependency; 
    private OtherDependency otherDependency; 

    @Autowired 
    public Foo(SomeDependency someDependency, OtherDependency otherDependency) { 
     this.someDependency = someDependency; 
     this.otherDependency = otherDependency; 
    } 
} 
+1

Mam z tym mały problem. Ta adnotacja działa w jednej części aplikacji, ale w teście otrzymuję komunikat o błędzie "no no-argument constructor". Czy możesz powiedzieć, czy istnieje sposób rozwiązania tego problemu bez podawania argumentów lub dodawania domyślnego konstruktora? –

+0

@JohnDoe: Musisz zadać nowe pytanie, zamiast zamieszczać komentarz do naprawdę starej odpowiedzi. Ponadto, jeśli to wszystko jest na twoje pytanie, nie dostaniesz dobrej odpowiedzi. Dołącz wykresy stosu i przykładowy kod, aby pokazać swój problem. Zobacz [SSCCE] (http://sscce.org/). Zobacz także [How To Ask] (http://stackoverflow.com/questions/how-to-ask). –

+0

Masz prawdopodobnie rację, rozważę utworzenie postu. –

Powiązane problemy