2012-03-20 2 views
3

JSF2 및 EJB stateless와 함께 Glassfish 3.1을 사용하여 Oracle DB를 쿼리하고 작성합니다. 이 웹 응용 프로그램에서 사용자가 채우려는 테이블에는 기본 키가 있습니다. 사용자가 새 레코드를 추가하려고하면 em.persist를 호출하는 ejb 메소드가 호출됩니다. 이제 사용자가 이미 사용 된 기본 키 값이있는 레코드를 추가하려고하면 EJB에서 예외가 발생합니다. 데이터베이스에 오류가 발생했음을 나타내는 메시지를 사용자에게 팝업하고 싶습니다. 그러나 JSF 관리 빈이 EJB 예외를 잡을 수있는 방법을 알 수 없습니다. 어떨까요?JSF + EJB 응용 프로그램에서 DB 예외를 catch하십시오.

답변

6

EJB는 시스템 예외 및 응용 프로그램 예외의 개념이 ... 형 왜냐하면 userexecption ... 얻을 열거 이유에서 예외입니다.

EntityExistsException과 같은 런타임 예외는 시스템 예외입니다. 이것들은 다른 트랜잭션들 사이에서 트랜잭션을 롤백시키고 EJB 인스턴스 bean을 폐기 (파기)시킵니다. 가장 중요한 문제는 EJBException입니다.

이러한 예외를 포착하는 데 필요한 마법은 없습니다.

백업 콩 :

@EJB 
private DAOBean daoBean; 

public void savePerson(Entity e) { 
    try { 
     daoBean.save(e); 
    } catch (EJBException e) {   
     FacesMessage message = new FacesMessage("entity is already exists."); 
     FacesContext.getCurrentInstance.addMessage(null, message); 
    }   
} 

EJB :

private EntityManager em; 

public void save(Entity e) {  
    em.persist(e);  
} 

주 당신이 볼 수있는 예외의 원인을 검색 할 수 있습니다
는 다음 그냥 작동합니다, 위의 페트르에서 코드를 조정 if가 EntityExistsException 또는 아닙니다 (간결을 위해 위에 생략 된). 당신은 아마이 경우에 대한 귀하의 EJB 인스턴스를 파괴 할 필요가 없기 때문에

는 더 나은 패턴은 RuntimeException에서 상속 true로 설정 rollback 속성으로 @ApplicationException와 주석이 자신의 예외를 정의하는 것입니다.

예.

@ApplicationException(rollback = true) 
public class MyException extends RuntimeException { 

    public MyException(Throwable cause) { 
     super(cause); 
    } 
} 

는 랩 당신이 예외로하여 EJB에서 EntityExistsException 및 던져 그것을 잡을 수있어.

아니요 오류 코드 또는 부울 성공/실패를 사용하는 것이 좋습니다. 이것은 잘 알려진 안티 패턴이며 코드의 오류가 발생하기 쉽습니다.

+0

알려 주셔서 감사합니다. 어떻게 작동하는지 잘 모르겠습니다. BTW, 그게 내가 아는 한 쓴 이유야. –

2

사용자 지정 예외 클래스를 만들 수 있습니다. 가능한 예외 옵션의 열거 형 값이있는 UserException이라고 가정 해 보겠습니다.

EJB에서는 메소드를 Throwable로 정의 할 수 있습니다. 예외를 throw해야하는 경우.

JSF-SiteBean에서는 간단한 try/catch 만 사용해야합니다.

관련 문제