EJB - Xử lý ngoại lệ
EJB là một phần của các ứng dụng doanh nghiệp thường dựa trên môi trường phân tán. Vì vậy, ngoài các ngoại lệ thông thường có thể xảy ra, có thể có các ngoại lệ như lỗi giao tiếp, quyền bảo mật, máy chủ ngừng hoạt động, v.v.
Vùng chứa EJB xem xét các trường hợp ngoại lệ theo hai cách:
Application Exception - Nếu quy tắc nghiệp vụ bị vi phạm hoặc ngoại lệ xảy ra trong khi thực hiện logic nghiệp vụ.
System Exception- Bất kỳ ngoại lệ nào, không phải do logic nghiệp vụ hoặc mã nghiệp vụ gây ra. RuntimeException, RemoteException là SystemException. Ví dụ, lỗi trong khi tra cứu EJB. RuntimeException, RemoteException là SystemException.
EJB Container xử lý các ngoại lệ như thế nào?
Khi nào Application Exceptionxảy ra, vùng chứa EJB chặn ngoại lệ, nhưng trả về giống như nó cho máy khách. Nó không quay trở lại giao dịch trừ khi nó được chỉ định trong mã bằng phương thức EJBContext.setRollBackOnly (). EJB Container không bao bọc ngoại lệ trong trường hợp Ngoại lệ Ứng dụng.
Khi nào System Exceptionxảy ra, EJB container chặn ngoại lệ, khôi phục giao dịch và bắt đầu các tác vụ dọn dẹp. Nó bao bọc ngoại lệ vào RemoteException và ném nó cho máy khách.
Xử lý ngoại lệ ứng dụng
Các ngoại lệ ứng dụng thường được đưa ra trong các phương thức Session EJB vì đây là các phương thức chịu trách nhiệm thực thi logic nghiệp vụ. Ngoại lệ ứng dụng nên được khai báo trong mệnh đề ném của phương thức nghiệp vụ và nên được ném trong trường hợp logic nghiệp vụ không thành công.
@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;
}
...
}
Xử lý ngoại lệ hệ thống
Ngoại lệ hệ thống có thể xảy ra bất cứ lúc nào như tra cứu tên không thành công, lỗi sql xảy ra khi tìm nạp dữ liệu. Trong trường hợp như vậy, ngoại lệ như vậy nên được bao bọc trong EJBException và trả lại cho máy khách.
@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;
}
...
}
Ở phía máy khách, xử lý 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());
}
}
...
}
}