2010-07-11 18 views
8

संपादित करें: मैं विकल्प के साथ स्प्रिंग 3 के @ExceptionHandler एनोटेशन और इस संयोजन में देखा है 1 नीचे एक बहुत साफ समाधान लग रहा है।पासिंग त्रुटियों

http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/mvc.html#mvc-exceptionhandlers

मैंने यह भी पाया कि यह एक अच्छा पढ़ने के लिए देखें: http://blog.decaresystems.ie/index.php/2006/04/07/difficult-choices-in-handling-exceptions-in-enterprise-java-applications/


मैं अब कुछ समय के लिए स्प्रिंग MVC ढांचे का उपयोग कर तथापि मैं एक साथ आने के लिए संघर्ष कर रहा हूँ विकसित किये जा रहे सेवा परत में जेएसपी में उठाए गए त्रुटियों को पारित करने का 'अच्छा' तरीका।

असल में, मुझे विश्वास नहीं है कि व्यापार तर्क ("यह क्षेत्र अनिवार्य है" से परे) वैलिडेटर्स में होना चाहिए, विशेष रूप से किसी भी तर्क के लिए जिसे डीबी तक पहुंच की आवश्यकता होती है। तो, मैं जो कर रहा हूं वह सेवा परत में आगे, अधिक जटिल सत्यापन और व्यावसायिक तर्क रख रहा है।

उदाहरण के लिए, मान लें कि मेरे पास एक ऐसा पृष्ठ है जो उपयोगकर्ता को पुस्तक खरीदने की अनुमति देता है। वे जेएसपी पर "खरीद" पर क्लिक करते हैं और नियंत्रक इसे सब कुछ करने के लिए सेवा कहते हैं ... अब, अगर सेवा देखती है कि उनके पास अपर्याप्त धन है - मैं इस संदेश को जेएसपी पर वापस कैसे प्राप्त करूं ताकि एक अच्छा छोटा उपयोगकर्ता को "अपर्याप्त धन" संदेश प्रदर्शित किया जा सकता है? मैं दो तरीकों पर विचार किया है और मुझे यकीन है कि जो सही है नहीं कर रहा हूँ ...

विकल्प 1: में अपवाद

पहला तरीका मैंने सोचा था कि सेवा परत में एक अपवाद को बढ़ाने के लिए किया गया था, यह जाल नियंत्रक और BindingResult को एक संदेश जोड़ें।

सेवा:

public void pay(Book book) throws InsufficientFundsException { 
    // Some logic goes here, which ends up throwing the above exception 
} 

नियंत्रक:

public ModelAndView(@ModelAttribute("book") Book book, BindingResult errors) { 
    try { 
     pay(book); 
    } catch (InsufficientFundsException ex) { 
     errors.reject("insufficient.funds"); 
    } 
    return new ModelAndView(blahblahblah); 
} 

विकल्प 2: दर्रा BindingResult परत सेवा करने के लिए

दूसरा तरीका सेवा परत को BindingResult वस्तु पारित किया गया था और इसके खिलाफ और त्रुटियों को उठाओ।

सेवा:

public void pay(Book book, BindingResult errors) { 
    // User has insufficient funds, so... 
    errors.reject("insufficient.funds); 
} 

मैं इन तरीकों में से दोनों के साथ समस्याओं देख सकते हैं। विकल्प 1 अजीब लगता है क्योंकि न केवल मुझे अपवाद पकड़ना है, फिर मुझे बाध्यकारी परिणाम में त्रुटि जोड़नी है, ऐसा लगता है जैसे मैं दो बार एक ही काम कर रहा हूं। और विकल्प 2 कंट्रोलर को सेवा परत को बहुत कसकर बांधने लगता है।

अंत में, मुझे पता नहीं है SimpleMappingExceptionResolver कि विकल्प 1 के साथ संयोजन के रूप में इस्तेमाल किया जा सकता है, लेकिन मुझे यकीन है कि यह कैसे उचित है नहीं कर रहा हूँ (शायद मैं एक उचित उदाहरण नहीं देखा है?)। उपर्युक्त उदाहरण में, केवल तर्क के लिए कहें कि मैं चाहता हूं कि उपयोगकर्ता फॉर्म के ऊपर एक लाल त्रुटि के साथ मूल रूप में वापस आ जाए, न कि पूरी तरह से अलग पृष्ठ पर रीडायरेक्ट किया गया हो। SimpleMappingExceptionResolver मुझे तब उपयोगी लगता है जब आप किसी उपयोगकर्ता को एक मानक त्रुटि पृष्ठ पर रीडायरेक्ट करना चाहते हैं जब कोई अपवाद उठाया जाता है (जो कि मैं नहीं जानना चाहता हूं)।

+1

मुझे लगता है कि विकल्प 1 आपकी सर्वश्रेष्ठ शर्त – skaffman

उत्तर

4

जावा स्वाभाविक रूप से इस तरह की चीज़ को संभालने के लिए अपवादों का उपयोग करता है। अंत में यह आम तौर पर आपके तर्क को सरल बनाता है और कुछ गलती की जांच करने के लिए भूलकर गलती करने का मौका कम कर देता है। आप कोड के मुख्य प्रवाह से त्रुटि तर्क को स्थानांतरित करने में भी सक्षम हैं।

मुझे नहीं पता कि आप जो मामला पेश करते हैं वह किसी अन्य मामले से अलग है जहां मैं त्रुटियों से निपटने के लिए अपवाद हैंडलिंग का उपयोग करूंगा।

+0

धन्यवाद होगा। स्प्रिंग 3 के अपवाद हैंडलर की आगे की जांच से पता चलता है कि मैं @ExceptionHandler एनोटेशन के माध्यम से नियंत्रक में उठाए गए अपवादों से निपट सकता हूं, जिसमें मैं इसका अनुरोध कर सकता हूं जैसा कि मैं अनुरोध करता हूं। यह मेरे लिए सामान्य rqeuest विधि में कोशिश/पकड़ने से थोड़ा अच्छा लगता है। –

+1

@ बेन जे: मुझे यकीन नहीं है कि '@ अपवाद हैंडलर' विधियों के पास 'बाइंडिंग रीसेट' तक पहुंच है या नहीं। – skaffman

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