2012-01-04 10 views
5

मैं वर्तमान में MyBatis स्प्रिंग एकीकरण ढांचे के साथ काम कर रहा हूँ और कहा कि मैं क्या डॉक्स से पढ़ा है:MyBatis मैपर सीधे सेवा कक्षा में इंजेक्शन दिया गया। अपवादों के बारे में क्या?

बजाय कोड डेटा का उपयोग वस्तुओं (DAOs) मैन्युअल SqlSessionDaoSupport या SqlSessionTemplate, का उपयोग कर Mybatis स्प्रिंग एक प्रॉक्सी कारखाने प्रदान करता है : MapperFactoryBean। यह कक्षा आपको डेटा मेपर इंटरफेस सीधे आपकी सेवा बीन्स में इंजेक्ट करने देती है। मैपर्स का उपयोग करते समय आप उन्हें बस कॉल करते हैं क्योंकि आपने हमेशा अपना डीएओ कहा है, लेकिन आपको किसी भी डीएओ कार्यान्वयन को कोड करने की आवश्यकता नहीं होगी क्योंकि MyBatis-Spring के लिए प्रॉक्सी बनाएगा।

यह एक बहुत अच्छी सुविधा है ... लेकिन अपवाद हैंडलिंग के बारे में क्या? मुझे SQL त्रुटियों का अनुवाद कहां करना चाहिए? मेरी सेवा परत में? लेकिन क्या यह सेवा-डीएओ पैटर्न का उल्लंघन नहीं करेगा?

उदाहरण:

public final class AccountServiceImpl implements AccountService { 
(...) 
    private AccountMapper accountMapper; 
(...) 
    @Override 
    public void addAccount(Account account) throws AccountServiceException { 

     //Validating, processing, setting timestamps etc. 
     (...) 

     //Persistence: 
     int rowsAffected; 
     try { 
      rowsAffected = accountMapper.insertAccount(account); 
     } catch (Exception e) { 
      String msg = e.getMessage(); 
      if (msg.contains("accounts_pkey")) 
       throw new AccountServiceException("Username already exists!"); 
      if (msg.contains("accounts_email_key")) 
       throw new AccountServiceException("E-mail already exists!"); 
      throw new AccountServiceException(APP_ERROR); 
     } 

     LOG.debug("Rows affected: '{}'", rowsAffected); 

     if (rowsAffected != 1) 
      throw new AccountServiceException(APP_ERROR); 
    } 

यह सेवा परत में अपवाद का अनुवाद करने के लिए ठीक है?

यह कैसे किया जाना चाहिए?

आपके लिए सलाह के लिए अग्रिम धन्यवाद।

उत्तर

6

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

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

AccountServiceException को छोड़कर आप उस के करीब हैं, Exception e पैरामीटर के रूप में लिया गया है। मैंने जितनी जल्दी हो सके अपने सभी डेटा एक्सेस को आजमाने और करने का विकल्प चुना और इसे सभी को एक ही प्रयास/पकड़ में लपेट लिया। चूंकि MapperFactoryBean हमेशा वसंत DataAccessExceptions में फेंकने वाले अपवादों का अनुवाद करता है, इसलिए आपको डेटा एक्सेस करते समय अन्य प्रकार के अपवादों को पकड़ने की चिंता करने की आवश्यकता नहीं है।

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

+0

बहुत अच्छा जवाब! धन्यवाद! –

1

सेवा परत में एप्लिकेशन-परिभाषित लोगों को MyBatis द्वारा डाले गए निम्न स्तर डेटाएक्सेक्स अपवादों का अनुवाद करना एक मानक अभ्यास है।

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

तो हाँ यह ठीक है और यहां तक ​​कि अनुशंसित भी है।

आम तौर पर मैं त्रुटि लॉग में डीएओ द्वारा फेंकने वाले अपवादों को लॉग करता हूं और एप्लिकेशन द्वारा परिभाषित कुछ को पुनर्स्थापित करता हूं।

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