2017-05-01 14 views
2

Ich verstehe nicht ... Ich Konstruktor eigentlich definiert, aber ich bin immerKein Konstruktor mit 0 Argumente in der Klasse definiert ist, wenn explizit Konstruktor definieren

No constructor with 0 arguments defined in class

@Component 
public class CustomMessageSource extends ReloadableResourceBundleMessageSource { 

public CustomMessageSource(Locale locale){ 

    this.propertiesHolder = getMergedProperties(locale);   

    this.properties = propertiesHolder.getProperties(); 
} 
//... other setting, getters 

Dies ist, wie ich es instanziiert

CustomMessageSource customMessage = new CustomMessageSource(locale);

Das ist mein Stack-Trace

Caused by: java.lang.NoSuchMethodException: com.app.service.CustomMessageSource.<init>() 
at java.lang.Class.getConstructor0(Class.java:3074) 
at java.lang.Class.getDeclaredConstructor(Class.java:2170) 
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:80) 
... 38 more 
+5

Ihr Konstruktor hat '1' Argument, nicht' 0'. Wenn Sie einen '0'-Konstruktor haben wollen und mindestens einen Konstruktor definiert haben, müssen Sie selbst einen' 0'-Konstruktor schreiben. Java liefert einen '0'-Konstruktor (default-constructor), wenn Sie überhaupt keinen Konstruktor geschrieben haben. – Turing85

+0

@ Turing85 Richtig, aber das Hinzufügen eines Konstruktors ohne Argumente scheint nicht geeignet zu sein, da es verhindert, dass eine 'CustomMessageSource'-Instanz mit einem konsistenten Status erstellt wird, der durch den Konstruktor mit definiertem Argument garantiert wird. – davidxxx

+1

Setzen Sie '@ Autowired' auf den Konstruktor (oder verwenden Sie Spring 4.3), um Spring zu bestimmen, welcher zu verwenden ist, andernfalls erwartet es einen Standard-Konstruktor ohne Argumente. –

Antwort

4

standardmäßig will Frühling die nicht arg Konstruktor durch Reflexion instanziiert:

com.app.service.CustomMessageSource.<init>() 

von @Autowired im Konstruktor spezifiziert, sollte es funktionieren:

@Autowired 
public CustomMessageSource(Locale locale){ 

Wenn Sie Frühling verwenden 4.3 Bei Beans, die mit einem einzelnen Konstruktor deklariert wurden, muss die @Autowired Annotation nicht angegeben werden. Quelle: https://spring.io/blog/2016/03/04/core-container-refinements-in-spring-framework-4-3

+0

danke für den Referenzlink ... Ich habe etwas gelernt ... –

+0

Sie sind herzlich willkommen :) – davidxxx

0

In Java können Sie mehrere Konstruktoren definieren. Wenn Sie einen Konstruktor mit Parametern hinzufügen möchten, müssen Sie zuerst den parameterlosen Konstruktor definieren. So wird Ihr Code wie folgt aussehen:

@Component 
public class CustomMessageSource extends ReloadableResourceBundleMessageSource { 

     public CustomMessageSource() {} 
     public CustomMessageSource(Locale locale){ 

      this.propertiesHolder = getMergedProperties(locale);   

      this.properties = propertiesHolder.getProperties(); 
     } 
     //... other setting, getters 
} 
Verwandte Themen