2013-08-06 4 views
6

Ich versuche, einen Konstruktor zu injizieren, der einige Argumente benötigt. Nach der Kompilierung von Spring beschwert es sich, dass es keinen Standardkonstruktor finden konnte (ich habe es nicht definiert) und BeanInstatiationException und NoSuchMethodException ausgelöst.Ist der Standardkonstruktor für die Spring-Injektion erforderlich?

Nach dem Definieren eines Standardkonstruktors erscheinen die Ausnahmen nicht mehr, jedoch wird mein Objekt niemals mit dem Argumentkonstruktor initialisiert, nur der Standardkonstruktor wird aufgerufen. Benötigt Spring in diesem Fall wirklich einen Standardkonstruktor? Und wenn ja, wie kann ich den Argumentkonstruktor anstelle des Standardkonstruktors verwenden?

Dies ist, wie ich alles anschließen:

public class Servlet { 

    @Autowired 
    private Module module; 

    (code that uses module...) 
} 

@Component 
public class Module { 

    public Module(String arg) {} 
    ... 
} 

Bean-Konfiguration:

<beans> 
    <bean id="module" class="com.client.Module"> 
    <constructor-arg type="java.lang.String" index="0"> 
    <value>Text</value> 
    </constructor-arg> 
    </bean> 

    ... 
</beans> 

Stapelüberwachung:

WARNING: Could not get url for /javax/servlet/resources/j2ee_web_services_1_1.xsd 
ERROR initWebApplicationContext, Context initialization failed 
[tomcat:launch] org.springframework.beans.factory.BeanCreationException: Error 
creating bean with name 'module' defined in URL [...]: Instantiation of bean failed; 
nested exception is org.springframework.beans.BeanInstantiationException: Could not 
instantiate bean class [com.client.Module]: No default constructor found; nested 
exception is java.lang.NoSuchMethodException: com.client.Module.<init>() 
+0

Spring erfordert keinen Standardkonstruktor (dh keine Argumente, richtig?). Fügen Sie den StackTrace dem Post hinzu, sonst glaube ich nicht, dass wir genug Informationen haben, um zu sagen, was vor sich geht. –

+0

Der Stack-Trace wurde hinzugefügt. Und ja, standardmäßig meine ich No-Args-Konstruktor. – agerrr

Antwort

7

Frühling nur "erfordert" ein Standard-Konstruktor, wenn Sie auf Plan es instanziieren ohne irgendwelche Argumente.

zum Beispiel, wenn Ihre Klasse so ist;

public class MyClass { 

    private String something; 

    public MyClass(String something) { 
    this.something = something; 
    } 

    public void setSomething(String something) { 
    this.something = something; 
    } 

} 

und Sie richten es im Frühling so ein;

<bean id="myClass" class="foo.bar.MyClass"> 
    <property name="something" value="hello"/> 
</bean> 

Sie werden einen Fehler erhalten. Der Grund ist, dass Spring instanziiert Ihre Klasse new MyClass() dann versucht, Anruf setSomething(..) setzen.

also sollte die Spring-XML stattdessen so aussehen;

<bean id="myClass" class="foo.bar.MyClass"> 
    <constructor-arg value="hello"/> 
</bean> 

haben so einen Blick auf Ihre com.client.Module und sehen, wie seine in Ihrem Spring-XML konfiguriert

+0

Ich denke ich habe alles richtig gemacht, ich habe meine Implementierung in die Frage aufgenommen. Wenn ich den Standardkonstruktor nicht vorschlage, beschwert sich Spring und der Code kompiliert nicht, wenn ich nur den Standardkonstruktor verwende, wird der Argumentkonstruktor ignoriert. Ich verstehe nicht warum. – agerrr

2

Genau das gleiche Problem konfrontiert, ich denke, bis jetzt können Sie das Problem gelöst haben.
Im Folgenden finden Sie, was Sie Ihre Bean-Konfiguration geändert haben könnte,

<bean id="module" class="com.client.Module"> 
     <constructor-arg value="Text"/> 
</bean> 
4

Vermutlich Sie Komponente-Scannen verwenden und da Sie Anmerkung @Component für Klasse-Modul definieren versucht, die Bohne zu instanziieren. Sie benötigen keine @Component Annotation, wenn Sie XML für die Bean-Definition verwenden.

Verwandte Themen