2011-03-01 13 views
7
<bean id="cObject" scope="request" class="x.y.z.CClass"/> 
<bean id="bObject" scope="request" class="x.y.z.BClass"/> 
<bean id="aObject" scope="request" class="x.y.z.AClass"> 
    <constructor-arg ref="bObject" /> 
    <property name="cRef" ref="cObject" /> 
</bean> 

aObject.cRef किसी कारण से सेट नहीं हो रहा है। ध्यान दें कि कन्स्ट्रक्टर-एर्ग और प्रॉपर्टी का उपयोग उसी परिभाषा में किया जाता है। मैंने इसी सुविधा के साथ एक उदाहरण/पोस्ट नहीं देखा है।कन्स्ट्रक्टर-Arg और संपत्ति बीन परिभाषा

+2

वसंत का कौन सा संस्करण? वसंत 3.0.5 के साथ मेरे लिए ठीक काम करता है। साथ ही, केवल एक या दूसरे को सेट करने का प्रयास करें। मेरा अनुमान है कि आपकी समस्या में मिश्रण संपत्ति और कन्स्ट्रक्टर-एर्ग के साथ कुछ लेना देना नहीं है। – Damien

+1

यह वाक्यविन्यास ठीक है। क्या आप वाकई * कन्स्ट्रक्टर के भीतर से * सीआरएफ' का उपयोग करने की कोशिश नहीं कर रहे हैं, क्योंकि यह उस बिंदु से निर्धारित नहीं होगा। – skaffman

+0

एक बीन के लिए एक भी कम केस पत्र से शुरू करने से वसंत, जैक्सन और अन्य लोगों के साथ परेशानी हो सकती है जो बीन विनिर्देश पर भरोसा करते हैं। यदि आपने संपत्ति को मेरी सीआरएफ में बदल दिया है तो क्या यह इस मुद्दे को हल करता है? – Hazok

उत्तर

2

मिश्रण <constructor-arg> और <property> आम तौर पर एक बुरा विचार है।

सिर्फ एक ही <constructor-arg> उपयोग करने के लिए अच्छा कारण है, और कहा कि अपरिवर्तनीय वस्तुओं को बनाने के लिए है।

हालांकि, यदि आप अपनी संपत्ति निर्धारित कर सकते हैं तो आपकी वस्तुएं अपरिवर्तनीय नहीं हैं। <constructor-arg> का उपयोग न करें। कक्षा को दोबारा डिजाइन करें, @PostConstruct के साथ एनोटेटेड एक प्रारंभिक विधि का उपयोग करें यदि आपको बीन निर्माण समय पर कुछ तर्क लागू करने की आवश्यकता है।

+0

यह समझ में आता है। autowire = "byName" और गुणों का उपयोग करके फिक्स्ड। किसी भी तरह जब स्ट्रेट बीन को तुरंत चालू करता है तो यह कस्टम कन्स्ट्रक्टर का उपयोग करके बीन का आविष्कार नहीं कर रहा था। यह फिक्स अधिक वांछनीय है। – anthos

2

ही स्रोतों पर अपने साथी की खोज:

Caused by: org.springframework.beans.factory.BeanCreationException: 
    Error creating bean with name 'service.MenuService#0' 
    defined in class path resource [spring-beans/integrator.xml]: 
    Could not resolve matching constructor (hint: specify index/type/name 
    arguments for simple parameters to avoid type ambiguities) 

जबकि मेरी मेजबान, परीक्षण और उत्पादन सर्वर में ऐसी कोई त्रुटि है।

के साथ:

<bean class="service.MenuService"> 
    <constructor-arg index="0" type="java.lang.String" value="#{user}"/> 
    <constructor-arg index="1" type="java.lang.String" value="#{password}"/> 
    <constructor-arg index="2" type="java.lang.String" value="#{uri}"/> 
    <property name="system" value="OPRT"/> 
    <property name="client" value="OPRT"/> 
</bean> 

जबकि वहाँ केवल एक सेम में 3-args निर्माता हैं।

कारण निर्माता का उपयोग करने - यह init() विधि लागू द्वारा गैर स्प्रिंग पुस्तकालय पर कुछ अतिरिक्त कार्यों प्रदर्शन। और फ़ील्ड के रूप में तर्क सेट करें।

तो मैं spring-beans.xml बदलें:

<bean class="service.MenuService" init-method="init"> 
    <property name="login" value="#{user}"/> 
    <property name="password" value="#{password}"/> 
    <property name="httpsUrl" value="#{uri}"/> 
    <property name="system" value="OPRT" /> 
    <property name="client" value="OPRT" /> 
</bean> 

init-method= भाग पर ध्यान रखना।

अद्यतन सब कुछ मैंने सरल XML कॉन्फ़िगरेशन लिखा और डीबगर में स्प्रिंग स्रोत कोड के माध्यम से कदम उठाया। लगता है कि वसंत 3.x के साथ उस में एक्सएमएल सेम परिभाषा निर्माता-आर्ग और संपत्ति गठबंधन करने के लिए संभव है (AbstractAutowireCapableBeanFactory.java में जाँच doCreateBean है, जो फोन createBeanInstance और populateBean अगले)।

यह भी देखें https://softwareengineering.stackexchange.com/questions/149378/both-constructor-and-setter-injection-together-in-spring/

संबंधित मुद्दे