EJB-예외 처리
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 메서드에서 발생합니다. 애플리케이션 예외는 비즈니스 메소드의 throws 절에 선언되어야하며 비즈니스 로직이 실패 할 경우 throw되어야합니다.
@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());
}
}
...
}
}