2012-11-22 26 views
9

मैं अपने कोड में बीन तत्काल अपवादों को पकड़ना चाहता हूं। आपके पास कौन से विकल्प हैं? एक तरह से यह करने के लिए जावा आधारित कंटेनर विन्यास का उपयोग करने के लिए है:वसंत - पकड़ बीन निर्माण अपवाद

@Configuration 
public class AppConfig { 
    @Bean 
    public SomeBean someBean() { 
    try { 
     return new SomeBean(); // throws SomeException 
    } catch(SomeException se) { 
     return new SomeBeanStub(); 
    } 
    } 
} 

कि संभव सेम इन्स्टेन्शियशन के लिए अपवाद संचालकों XML- आधारित या एनोटेशन आधारित विन्यास का उपयोग कर स्प्रिंग का उपयोग कर परिभाषित करने के लिए है?

+0

क्या आपको ऐसा करने का कोई तरीका मिला? मैं इसे पकड़ना चाहता हूं, और प्रक्रिया को मारना चाहता हूं, सर्वर को इसे लोड न करने दें। मेरी समस्या यह है कि अगर कुछ बीन ठीक से लोड नहीं होते हैं, लेकिन अन्य करते हैं, तो आप एक असंगत व्यवहार प्राप्त करते हैं। –

उत्तर

0

आपको ऐसा करने का अनुमान नहीं है। स्प्रिंग होने के लिए यह एक बीन बनाने का पूरा बिंदु है। यदि आप new (ऊपर की तरह) का उपयोग करके अपने स्वयं के सेम बनाना चाहते हैं, तो वसंत का उपयोग अपने लिए बीन्स बनाने के लिए क्यों करें?

आप वास्तव में निर्भरता इंजेक्शन और सभी के बजाय अपने स्वयं के लिए ऑब्जेक्ट आवंटित कर सकते हैं और काम कर सकते हैं।

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

इसलिए सबसे अच्छा यह प्रारंभिकरण में विफल रहता है ताकि एप्लिकेशन सुसंगत हो। हालांकि मुझे ऐसा करने का कोई अन्य वैध तरीका नहीं पता है।

+0

धन्यवाद। प्रश्न संदर्भ निम्नलिखित है: यदि बीन्स (डेटाबेस विफलता, अन्य बाहरी त्रुटियों) के तत्कालता के दौरान कुछ बुरा होता है, तो इसे कुछ रखरखाव मोड में स्विच करना चाहिए। बीन निर्माण अपवादों को पकड़ने के बिना यह संभव नहीं है। क्या आप कृपया विस्तार से बता सकते हैं कि एक रैपर यहां कैसे मदद कर सकता है? – khachik

+1

उत्तर संपादित किया गया :) – Jatin

2

बस पूर्णता के लिए।

आप बीन में आलसी भी आलसी कर सकते हैं और पहली बार जब आप बीन का उपयोग करते हैं तो अपवाद को पकड़ सकते हैं।

वसंत config:

<bean id="a" class="A" lazy-init="true" /> 

जावा में:

import org.springframework.beans.factory.BeanCreationException; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.context.annotation.Lazy; 

public class B { 

    @Autowired 
    @Lazy 
    A a; 

    public void foo(){ 
     try{ 
       a.foo(); 
     } catch (BeanCreationException e){ 
       // ignore if you want 
     } 
    } 
} 
8

विधि someBeanSomeException पकड़ने चाहिए और उसके बाद कारण के रूप में SomeException साथ BeanCreationException फेंक:

@Configuration 
public class AppConfig { 
    @Bean 
    public SomeBean someBean() { 
    try { 
     return new SomeBean(); // throws SomeException 
    } catch (SomeException se) { 
     throw new BeanCreationException("someBean", "Failed to create a SomeBean", se); 
    } 
    } 
} 
+0

यह करने का यह सही तरीका है। – Alex

0

मामले में अगर आप होने के दौरान विफलताओं की उम्मीद है एक सृजन और बीन शेष एप्लिकेशन (सुंदर वैध स्थिति) के लिए अनिवार्य नहीं है जैसा कि आपने @ बीन विधि निकाय में सभी विफलता अपवादों को पकड़कर और null लौटाकर संकेत दिया है कि बीन निर्माण विफल हो गया है। बीन इस मामले में स्प्रिंग एप्लिकेशन संदर्भ में नहीं जोड़ा जाएगा और यदि संदर्भ दिए गए बीन पर कोई अनिवार्य निर्भरता नहीं है तो संदर्भ निर्माण सफल होगा।

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