2013-08-06 88 views
6

我想注入一個構造函數,它需要一些參數。在編譯Spring抱怨之後,它找不到默認構造函數(我沒有定義它)並拋出BeanInstatiationException和NoSuchMethodException。Spring注入中需要默認構造函數嗎?

定義默認構造函數後,異常不再出現,但是我的對象永遠不會使用參數構造函數初始化,只調用默認構造函數。在這種情況下,Spring是否真的需要默認構造函數?如果是的話,我怎樣才能使用參數構造函數而不是默認的?

這是我的接線一切:

public class Servlet { 

    @Autowired 
    private Module module; 

    (code that uses module...) 
} 

@Component 
public class Module { 

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

bean的配置:

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

    ... 
</beans> 

堆棧跟蹤:

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不需要默認(意思是無參數,對吧?)構造函數。添加stacktrace到帖子,否則我認爲我們沒有足夠的信息來告訴發生了什麼。 –

+0

添加了堆棧跟蹤。是的,默認情況下,我的意思是無參數構造函數。 – agerrr

回答

7

春只是 「要求」 一個默認的構造函數,如果你打算實例化它沒有任何參數。

例如,如果你的班級是這樣的;

public class MyClass { 

    private String something; 

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

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

} 

和你在春天這樣設置它;

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

你會得到一個錯誤。原因是Spring實例化你的類new MyClass(),然後嘗試設置調用setSomething(..)

因此,Spring xml看起來應該像這樣;

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

所以看看你的com.client.Module,看看它是如何在你的Spring XML

+0

我想我所做的一切都是正確的,包括我在問題中的實現。如果我沒有指定默認構造函數,Spring會抱怨並且代碼不會編譯,如果我這樣做,只會使用默認構造函數,則會忽略參數構造函數。我不明白爲什麼。 – agerrr

2

就面臨着同樣的問題配置,我猜到現在你可能已經解決了這個問題。
以下是你可能改變你的bean的配置,

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

最有可能使用的是組件,掃描和自定義的類模塊註釋@Component它試圖實例化的bean。如果您使用XML進行bean定義,則不需要註釋@Component

相關問題