EJB có khái niệm về ngoại lệ hệ thống và ngoại lệ ứng dụng.
Các ngoại lệ thời gian chạy, như EntityExistsException
là các ngoại lệ của hệ thống. Những điều này trong số những người khác sẽ khiến bất kỳ giao dịch nào được khôi phục lại và khiến bean phiên bản EJB bị loại bỏ (bị phá hủy). Quan trọng nhất đối với vấn đề của bạn, chúng sẽ được bao bọc trong một EJBException
.
Không có phép thuật nào xung quanh việc bắt những trường hợp ngoại lệ này. Điều chỉnh mã từ Petr ở trên,
những điều sau sẽ chỉ hoạt động:
Đậu hậu:
@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);
}
Lưu ý rằng bạn có thể truy xuất nguyên nhân của ngoại lệ để xem có phải là EntityExistsException
không hoặc không (bỏ qua ở trên cho ngắn gọn).
Vì bạn có thể không cần phải hủy cá thể EJB của mình cho trường hợp này, nên một mẫu tốt hơn là xác định ngoại lệ của riêng bạn kế thừa từ RuntimeException
và được chú thích bằng @ApplicationException
với rollback
thuộc tính được đặt thành true.
Ví dụ:
@ApplicationException(rollback = true)
public class MyException extends RuntimeException {
public MyException(Throwable cause) {
super(cause);
}
}
Kết thúc EntityExistsException
của bạn trong EJB của bạn vào ngoại lệ này và ném và bắt nó.
Tôi thực sự khuyên bạn KHÔNG ĐƯỢC để sử dụng mã lỗi hoặc kết quả là thành công / thất bại boolean. Đây là một mẫu chống nổi tiếng và làm cho mã của bạn dễ bị lỗi một cách đáng kinh ngạc.