EJB - अपवाद हैंडलिंग

ईजेबी उद्यम अनुप्रयोगों का एक हिस्सा है जो आम तौर पर वितरित वातावरण पर आधारित होते हैं। तो, सामान्य अपवादों के अलावा जो हो सकते हैं, संचार विफलता, सुरक्षा अनुमतियाँ, सर्वर डाउन आदि जैसे अपवाद हो सकते हैं।

EJB कंटेनर दो तरह से अपवाद मानता है -

  • Application Exception - यदि व्यापार तर्क का उल्लंघन किया जाता है या व्यापार तर्क निष्पादित करते समय अपवाद होता है।

  • System Exception- कोई भी अपवाद, जो व्यापार तर्क या व्यवसाय कोड के कारण नहीं है। RuntimeException, RemoteException SystemException हैं। उदाहरण के लिए, EJB लुकअप के दौरान त्रुटि। RuntimeException, RemoteException SystemException हैं।

EJB कंटेनर हैंडल अपवाद कैसे होता है?

कब Application Exceptionतब होता है, EJB कंटेनर अपवाद को स्वीकार करता है, लेकिन ग्राहक को वही देता है जो वह है। जब तक यह EJBContext.setRollBackOnly () विधि द्वारा कोड में निर्दिष्ट नहीं किया जाता है, तब तक यह लेनदेन वापस नहीं करता है। EJB कंटेनर अनुप्रयोग अपवाद के मामले में अपवाद को लपेटता नहीं है।

कब System Exceptionतब होता है, EJB कंटेनर अपवाद को स्वीकार करता है, लेन-देन को रोलबैक करता है और सफाई कार्यों को शुरू करता है। यह अपवाद को RemoteException में लपेटता है और क्लाइंट को फेंकता है।

हैंडलिंग अनुप्रयोग अपवाद

आवेदन अपवाद आमतौर पर सत्र EJB विधियों में फेंक दिए जाते हैं क्योंकि ये व्यापारिक तर्क को निष्पादित करने के लिए जिम्मेदार तरीके हैं। आवेदन अपवाद को व्यापार पद्धति के थ्रो क्लॉज में घोषित किया जाना चाहिए और यदि व्यावसायिक तर्क विफल हो जाता है तो उसे फेंक दिया जाना चाहिए।

@Stateless
public class LibraryPersistentBean implements LibraryPersistentBeanRemote {
	
   ...

   public List<Book> getBooks() throws NoBookAvailableException {        
      List<Book> books = 
         entityManager.createQuery("From Books").getResultList();
      if(books.size == 0)
		throw NoBookAvailableException
           ("No Book available in library.");
      return books;
   }
   ...
}

हैंडलिंग सिस्टम अपवाद

सिस्टम अपवाद किसी भी समय हो सकता है जैसे कि नामकरण लुकअप विफल रहता है, डेटा लाते समय SQL त्रुटि उत्पन्न होती है। ऐसे मामले में, इस तरह के अपवाद को EJBException के तहत लपेटा जाना चाहिए और क्लाइंट को वापस फेंक दिया जाना चाहिए।

@Stateless
public class LibraryPersistentBean implements LibraryPersistentBeanRemote {
	
   ...

   public List<Book> getBooks() {   
      try {
         List<Book> books = 
            entityManager.createQuery("From Books").getResultList();
      } catch (CreateException ce) {
         throw (EJBException) new EJBException(ce).initCause(ce);
      } catch (SqlException se) {
         throw (EJBException) new EJBException(se).initCause(se);    
      }	  
      return books;
   }
   ...
}

क्लाइंट की तरफ, EJBException को हैंडल करें।

public class EJBTester {
   private void testEntityEjb() {
   ...
   try{
      LibraryPersistentBeanRemote libraryBean =
      LibraryPersistentBeanRemote)ctx.lookup("LibraryPersistentBean/remote");
   
      List<Book> booksList = libraryBean.getBooks();
   } catch(EJBException e) {
      Exception ne = (Exception) e.getCause();
      if(ne.getClass().getName().equals("SqlException")) {
         System.out.println("Database error: "+ e.getMessage());
      }
   }
   ...
   }
}