2009-05-06 23 views
10

मैं इंजेक्शन की आवश्यकता वाले क्षेत्रों पर स्प्रिंग के @ कॉन्फिगर करने योग्य एनोटेशन डब्ल्यू/@ रिसोर्स के माध्यम से स्वत: निर्भरता इंजेक्शन का उपयोग करने की कोशिश कर रहा हूं। इसमें कुछ सेटअप शामिल थे, जैसे वसंत-एजेंट.जर को मेरे जेवीएम में पास करना। पूर्ण विवरण see here के लिए।स्प्रिंग का @ कॉन्फिगर करने योग्य कभी-कभी काम क्यों करता है और कभी-कभी नहीं?

यह काम करता है ... ज्यादातर। जब मेरा टॉमकैट बूट हो रहा है, तो मैं AspectJ init संदेशों को देखता हूं, मेरे उपयोगकर्ता ऑब्जेक्ट्स स्वचालित रूप से फ़ाइल सेवा संदर्भ प्राप्त करते हैं, आदि

समस्या यह है कि कभी-कभी ऐसा नहीं होता है। यह पूरी तरह से यादृच्छिक प्रतीत होता है; कभी-कभी मैं बूट हो जाता हूं और निर्भरता इंजेक्शन नहीं होती है, कभी-कभी वे होती हैं। मुझे पहले अपने उपयोगकर्ता पर @ ट्रांसेक्शनल के साथ परेशानी थी क्योंकि उसने एक संघर्ष बनाया, मैं प्रॉक्सी के साथ विश्वास करता हूं। मैं जेपीए का उपयोग कर रहा हूं, इसलिए मेरा उपयोगकर्ता @ एन्टीटी के साथ चिह्नित है, इसलिए मेरा सबसे अच्छा अनुमान यह है कि यह एक संघर्ष बना रहा है। मैंने पढ़ा है कि आप एक प्रॉक्सी ऑटो प्रॉक्सी नहीं कर सकते हैं। संघर्ष को ऑफ़सेट करने के लिए, मैंने CGLIB और javassist को छोड़कर मुझे कुछ नोट्स का पालन किया जो हाइबरनेट (मेरा जेपीए इम्प्लायर) उपयोग करता है।

सुराग:

  • यह सब या कुछ भी नहीं है। मेरे सभी @ कॉन्फिगर करने योग्य उदाहरणों को इंजेक्शन दिया गया है या उनमें से कोई भी नहीं है।
  • डीबी से इकाई को फिर से लोड करना (पुनः स्थापित करना) मदद करने के लिए प्रकट नहीं होता है; यह या तो काम कर रहा है या नहीं।
  • किसी भी समय टॉमकैट को रिबूट करने से यह भी ठीक नहीं होगा। पासा रोल करने के लिए प्रतीत होता है कि एकमात्र चीज एक पुनर्वितरण है। दूसरे शब्दों में, यदि मैं पुन: नियोजित करता हूं तो यह काम कर सकता है।

मैं यह कैसे पता लगा सकता हूं कि क्या गलत हो रहा है? क्या कोई जेपीए के साथ @ कॉन्फिगर करने योग्य है? मेरी निर्भरता जांच क्यों नहीं है = सही निर्भरता वास्तव में इंजेक्शन नहीं होने पर एक त्रुटि फेंक रही है?

इकाई

@Entity 
@Configurable(dependencyCheck = true) 
@NamedQueries({ @NamedQuery(name = "User.findAll", query = "SELECT user FROM User user"), 
    @NamedQuery(name = "User.findByEmail", query = "SELECT user FROM User user WHERE user.email = :email") }) 
public abstract class User extends BaseModel { 

private static final long serialVersionUID = 7881431079061750040L; 

@Id 
@GeneratedValue(strategy = GenerationType.TABLE) 
private Long id; 

@Column(unique = true, nullable = false) 
private String email; 

@Basic(optional = false) 
private String password; 

@Resource 
private transient UserEmailer userEmailer; 

@Resource 
private transient FileService fileService; 

... 

aop.xml

<!DOCTYPE aspectj PUBLIC 
    "-//AspectJ//DTD//EN" "http://www.eclipse.org/aspectj/dtd/aspectj.dtd"> 
<aspectj> 
    <weaver options="-verbose"> 
     <include within="com.myapp.domain..*" /> 
     <exclude within="*..*CGLIB*" /> 
     <exclude within="*..*javassist*" /> 
    </weaver> 
    <aspects> 
     <aspect name="org.springframework.beans.factory.aspectj.AbstractInterfaceDrivenDependencyInjectionAspect" /> 
    </aspects> 
</aspectj> 

applicationContext.xml

... 

<context:spring-configured /> 

<context:load-time-weaver /> 

<context:component-scan base-package="com.myapp" /> 

... 
+1

मैं भी इन प्रकार के मुद्दों को @ कॉन्फिगर करने योग्य और @ ट्रान्सैक्शनल के साथ अनुभव कर रहा हूं मुझे लगता है कि वसंत संदर्भ शुरू होने से पहले वर्ग लोडर को कक्षा लोडर के साथ करना होगा। इस धागे को देखें: http://forum.springsource.org/showthread.php?t=68406। स्पोरैडिक प्रकृति यह बग बेहद परेशान है। – ghempton

+1

वसंत में सभी बदलावों को देखते हुए, क्या अब इस समस्या का बेहतर समाधान है? – Snekse

उत्तर

1

जब इंजेक्शन नहीं करता है काम नहीं करते, किसी भी कारण से, किसी भी निर्भरता जांच करने के लिए कोड का कोई तरीका नहीं है, इसलिए अब त्रुटि फेंक दी गई है।

अन्यथा मैं यहां कुछ भी नहीं देख सकता जो यादृच्छिक विफलता को इंगित करेगा। क्या आप जांचने के लिए एक सरलीकृत उदाहरण निकाल सकते हैं?

+0

हाय जोर्न, टिप्पणी के लिए धन्यवाद। मैं घर आने पर एक सरल उदाहरण का प्रयास करूंगा। मुझे इसे अपडेट करने की ज़रूरत है प्रश्न, क्योंकि मैंने वसंत-एजेंट.जर का उपयोग छोटे-स्कोप्ड टॉमकैट इंस्ट्रुमेबल क्लासलोडर से करने के बाद से स्विच किया है, अनुभाग 6.8.4.6.2 देखें। वसंत संदर्भ डॉक्यूम का टोमकैट ईएनटी। विचित्र रूप से, यह परिवर्तन समस्या की आवृत्ति को कम करने के लिए प्रतीत होता है, लेकिन इसे पूरी तरह से ठीक नहीं करता है। – rcampbell

+0

क्या कोई कारण है कि आप @Configurable @Component पर उपयोग कर रहे हैं? –

+0

प्रलेखन के अनुसार वे दोनों एक ही चीज़ को पूरा करेंगे। मैं स्प्रिंग-प्रबंधित बीन्स पर डी इंजेक्शन के लिए @ कॉम्पोनेंट का उपयोग करता हूं, जबकि मैं गैर स्प्रिंग-प्रबंधित बीन्स पर डी इंजेक्शन के लिए @ कॉनफिग का उपयोग करता हूं। तो भले ही वे दोनों काम करेंगे, मैं अलग-अलग लोगों का उपयोग एक बीन की वसंत स्थिति के संकेत के लिए करता हूं। – rcampbell

2

कुछ भी स्पष्ट नहीं दिख सकता है, तो बस एक सुझाव - क्या आपने संकलन-समय बुनाई का उपयोग करने की कोशिश की है? उम्मीद है कि रनटाइम पर लगातार परिणाम मिलेगा, हालांकि यह विकास के दौरान थोड़ा और परेशानी हो सकती है।

+0

मैं उत्पादन तैनाती के लिए संकलन-समय बुनाई का उपयोग करने का सुझाव भी दूंगा। पहलू-जे वीवर जेडीके पैरामीटर सेट करने के लिए भूलने वाले किसी व्यक्ति से संबंधित मुद्दों को भी रोकता है। । । । संकलन-समय बुनाई एकीकरण परीक्षण के लिए बहुत अच्छा है। –

1

ऐसा लगता है जैसे आपकी तैनाती प्रक्रिया संदिग्ध है। क्या आप काम पर तैनाती कर सकते हैं, फिर उसे निर्देशिका में कॉपी करें। फिर एक और तैनाती करें जब तक कि आप ऐसा न करें जो काम नहीं करता है। (किसी भी क्रम में) फिर अंत में, दो परिनियोजन निर्देशिका संरचनाओं और फ़ाइलों की तुलना करने के लिए तुलना की तुलना में एक उपकरण का उपयोग करें, और देखें कि कोई अंतर है या नहीं।

शुभकामनाएं, कुछ उत्पादकता को मारने के लिए एक यादृच्छिक यादृच्छिक समस्या की तरह कुछ नहीं।

+1

यह वास्तव में एक अच्छा विचार है जिसे मैंने कभी नहीं माना। मैं आज रात कोशिश करूँगा। बीटीडब्लू, यह मजाकिया है कि मैंने अपनी उत्पादकता में वृद्धि के लिए @ कॉन्फिगर करने योग्य का उपयोग शुरू किया; इससे पहले कि मैं कुछ बिंदुओं (जैसे कारखाना, रेपो, इत्यादि) पर मैन्युअल डी कर रहा था और मैं उन मिस्ड क्षेत्रों का पीछा कर रहा था जहां डोमेन ऑब्जेक्ट तत्काल है लेकिन कभी इंजेक्शन नहीं दिया गया। अभी मैं कहूंगा कि @ कॉफ़िग लालित्य के लिए +1 है, -1 उत्पाद समाधान के लिए मूल समाधान – rcampbell

+0

हाँ की तुलना में, हाँ, मैं अब एक प्रोजेक्ट पर हूं, जहां मैं नई तकनीकों का एक सेट उपयोग कर रहा हूं। जब तक आप इसे कूल्हे पर नहीं बनाते तब तक वे उत्पादकता में शायद ही कभी सुधार करते हैं। मैंने वसंत की एनोटेटेड गुणों का सामना करने की भी कोशिश नहीं की है। बहुत सारी नई चीजें, और एक्सएमएल हर बार काम करता है। –

3

सबसे पहले मुझे यह कहना है कि संसाधन मॉडल, सेवाओं या अन्य बीन्स को डेटा मॉडल वर्गों में निर्भरता के रूप में इंजेक्शन देना शायद एक अच्छा विचार नहीं है। लेकिन यह डिजाइन का सवाल है।

@ कॉन्फिगर करने योग्य के उपयोग के लिए मैंने उन मामलों में इसका उपयोग किया जहां वस्तुओं को वसंत संदर्भ के बाहर से तत्काल किया जाता है - जैसे वेब अनुप्रयोगों, फ़िल्टर या सर्लेट में कस्टम टैग। मैंने जिस तरह से उनका उपयोग करने की कोशिश की, वह आपके द्वारा लोड किए जाने वाले लोड समय बुनाई से था। यह काफी अच्छा काम करता था लेकिन इसमें डीबगिंग अब काम नहीं करने के दौरान गर्म कोड परिनियोजन जैसी कुछ कमियां थीं।

मैंने आपके द्वारा वर्णित बिल्कुल भी समस्या का अनुभव किया और इसलिए मैंने समय संकलित करने के लिए लोड समय बुनाई से स्विच करने का निर्णय लिया। इसलिए मैंने ग्रहण में AJDT plugin स्थापित किया और वसंत के एस्पेक्ट समर्थन का उपयोग किया। उसने मेरी समस्याओं का हल किया।

+0

धन्यवाद थॉमस। मेरे पास कुछ स्पष्टीकरण है कि मैंने इसे इस तरह क्यों डिजाइन किया: http://stackoverflow.com/questions/694374/how-can-i-resolve-the-conflict-between-loose-coupling- निर्भरता- इंजेक्शन-and-a असल में यह मुझे प्रभावित करने वाले डोमेन-संचालित डिज़ाइन पर आता है। मेरे डोमेन मॉडल सिर्फ डेटा थे; वे ज्यादातर टेबल पंक्तियों का प्रतिनिधित्व करते हैं।इस बहुत अच्छी किताब को पढ़ने के बाद, मैंने ओओपी/डेटा + व्यवहार की ओर बढ़ने का फैसला किया, जड़ संस्थाएं अपने बच्चों की संस्थाओं के लिए ज़िम्मेदार हैं, आदि। इसका एक अच्छा उदाहरण है जहां मैं इसका उपयोग करता हूं, एक बच्चे की इकाई के लिए वसंत-वायर्ड फैक्ट्री को इंजेक्ट करना अपने माता-पिता में – rcampbell

+0

जिसका मतलब है "बहुत अच्छी किताब"? दिलचस्प लगता है ... –

+0

पुस्तक एरिक इवांस द्वारा डोमेन-संचालित डिजाइन है। मैंने मार्टिन फाउलर द्वारा एंटरप्राइज़ एप्लिकेशन आर्किटेक्चर के पैटर्न में इसकी सिफारिश के बारे में सीखा जो कि एक और वास्तव में एक महान किताब है। – rcampbell

3

मेरे लिए यह वसंत में एक प्रसिद्ध बग के एक अवसर की तरह लगता है: http://jira.springframework.org/browse/SPR-5401

क्या यह हो सकता है कि आप कई अनुप्रयोग संदर्भों में कॉन्फ़िगर करने योग्य का उपयोग करने का प्रयास कर रहे हैं? इस मामले में उनमें से केवल एक निर्भरता इंजेक्शन के अधीन होगा। कौन सी जीत जीतती है इस पर निर्भर करता है कि किस एप्लिकेशन संदर्भ को लोड किया जाना अंतिम है।

समाधान? कोई नहीं :-(इस मुद्दे को ठीक करने की कोई योजना नहीं है। कम से कम स्प्रिंगसोर्स लड़के ने जर्मनी में जेएक्स सम्मेलन में अप्रैल में कहा था।

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