2011-09-20 27 views
24

मैं अपने auditRecord कक्षा के लिए एक डिफ़ॉल्ट कन्स्ट्रक्टर नहीं बनाना चाहता हूं।क्या वसंत को सभी बीन्स को एक डिफ़ॉल्ट कन्स्ट्रक्टर की आवश्यकता होती है?

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 

यह वास्तव में आवश्यक है:

लेकिन वसंत यह पर जोर देते हैं लगता है?

+0

कृपया अपने config पता चलता है कि सेम लोड करता है - एक्सएमएल या एनोटेशन – atrain

+0

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

उत्तर

1

आप निर्माता आधारित इंजेक्शन है, यानी कुछ इस तरह (प्रलेखन से लिया पाया here)

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

करने में सक्षम हो सकता है, लेकिन मुझे यकीन है कि यह काम करेगा नहीं हूँ।

यदि आप जावाबीन को परिभाषित कर रहे हैं, तो आपको सम्मेलन का पालन करना होगा और उस पर सार्वजनिक नो-एर्ग कन्स्ट्रक्टर डालना होगा।

28

नहीं, आपको डिफ़ॉल्ट (कोई तर्क नहीं) रचनाकारों का उपयोग करने की आवश्यकता नहीं है।

आपने अपनी बीन को कैसे परिभाषित किया? ऐसा लगता है कि आप इनमें से किसी एक की तरह अपने सेम कुछ दृष्टांत के लिए स्प्रिंग बता दिया है हो सकता है की तरह:

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

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

आप कहाँ एक निर्माता तर्क नहीं प्रदान की थी। पिछला डिफ़ॉल्ट (या कोई तर्क नहीं) रचनाकारों का उपयोग करेगा। आप इसे ref का उपयोग कर सकते

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

आप अपने आवेदन के संदर्भ में एक और सेम का संदर्भ लेना चाहते हैं, तो: यदि आप एक निर्माता है कि बहस में ले जाता है का उपयोग करना चाहते हैं, तो आप की तरह constructor-arg तत्व के साथ उन्हें निर्दिष्ट करने की आवश्यकता val विशेषता के बजाय constructor-arg तत्व की विशेषता।

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

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

निकोलस का जवाब एक्सएमएल कॉन्फ़िगरेशन के लिए पैसे पर सही है। मैं तो बस का कहना है कि जब एनोटेशन आपके सेम कॉन्फ़िगर करने के लिए का उपयोग कर करना चाहते हैं, यह न केवल निर्माता इंजेक्शन करने के लिए आसान है, यह यह करने के लिए एक और अधिक प्राकृतिक तरीका है:

class Foo { 
    private SomeDependency someDependency; 
    private OtherDependency otherDependency; 

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

मुझे इसके साथ एक छोटी सी समस्या है। यह एनोटेशन एप्लिकेशन के एक हिस्से में काम करता है, लेकिन परीक्षण में मुझे 'नो नो-तर्क कन्स्ट्रक्टर' त्रुटि मिलती है। क्या आप कृपया बता सकते हैं कि तर्क को इंजेक्शन देने या डिफ़ॉल्ट कन्स्ट्रक्टर जोड़ने के बिना हल करने का कोई तरीका है या नहीं? –

+0

@ जॉन डी: आपको वास्तव में पुराने उत्तर पर टिप्पणी पोस्ट करने के बजाय एक नया प्रश्न पूछने की आवश्यकता है। साथ ही, अगर आपके प्रश्न के बारे में सब कुछ है, तो आपको एक अच्छा जवाब नहीं मिल रहा है। अपनी समस्या का प्रदर्शन करने के लिए उपयुक्त स्टैक निशान और उदाहरण कोड शामिल करें। [एसएससीसीई] देखें (http://sscce.org/)। यह भी देखें [कैसे पूछें] (http://stackoverflow.com/questions/how-to-ask)। –

+0

आप शायद सही हैं, मैं पोस्ट बनाने पर विचार करूंगा। –