संपादित करें: मैं विकल्प के साथ स्प्रिंग 3 के @ExceptionHandler
एनोटेशन और इस संयोजन में देखा है 1 नीचे एक बहुत साफ समाधान लग रहा है।पासिंग त्रुटियों
मैंने यह भी पाया कि यह एक अच्छा पढ़ने के लिए देखें: 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 आपकी सर्वश्रेष्ठ शर्त – skaffman