我使用Glassfish 3.1和JSF2以及EJB無狀態來查詢和編寫Oracle數據庫。用戶想要在此Web應用程序中填充的表具有主鍵。當用戶嘗試添加新記錄時,會調用調用em.persist的ejb方法。現在,如果用戶試圖添加一個已經使用過主鍵值的記錄,那麼我在EJB中發現了一個異常。 我想彈出一條消息給用戶,指出數據庫中發生錯誤,但我無法弄清楚JSF託管bean如何捕獲EJB異常。 有什麼辦法嗎?在JSF + EJB應用程序中捕獲數據庫異常
3
A
回答
6
EJB有系統異常和應用程序異常的概念。
運行時異常,例如EntityExistsException
是系統異常。這些將導致任何事務被回滾並導致EJB實例bean被丟棄(銷燬)。最重要的是你的問題,他們將被包裹在EJBException
。
圍繞這些例外沒有什麼魔法。從切赫上述調整的代碼,
下面將只是工作:
支持bean:
@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);
}
請注意,您可以檢索異常的原因看如果是EntityExistsException
或不是(爲簡潔起見,以上省略)。
因爲你很可能沒有必要摧毀你的EJB實例這種情況下,一個更好的模式來定義自己的異常,從一個RuntimeException
繼承並標註有該@ApplicationException
與rollback
屬性設置爲true。
E.g.
@ApplicationException(rollback = true)
public class MyException extends RuntimeException {
public MyException(Throwable cause) {
super(cause);
}
}
將您的EntityExistsException
包裝到您的EJB中,並將其拋出並捕獲它。
我強烈建議你不要使用錯誤代碼或布爾成功/失敗作爲結果。這是一個衆所周知的反模式,並使您的代碼難以置信的出錯。
2
您可以創建自定義的異常類。假設UserException
帶有可能的異常選項的枚舉值。
在你的EJB中,你可以將你的方法定義爲可拋出的。如果你需要拋出異常。
在你的JSF-SiteBean中,你只需要使用一個簡單的try/catch。
是從類型UserException ...得到枚舉理由例外...等
相關問題
- 1. 在Kohana中捕獲數據庫異常
- 2. 如何捕獲數據庫異常?
- 3. ACRA應用程序崩潰庫不捕獲設備異常
- 4. 如何在c#中的Windows應用程序中捕獲異常?
- 5. 在playframework中捕捉數據庫異常
- 6. 在Windows窗體應用程序中捕獲應用程序異常
- 7. 如何在java fx應用程序中捕獲任務異常?
- 8. 在Eclipse/Java應用程序中被捕獲的異常通知
- 9. 如何在iPhone應用程序中捕獲所有異常
- 10. 在控制檯應用程序中捕獲異常C#
- 11. 如何在黑莓應用程序中捕獲未被捕獲的異常?
- 12. 獲取遠程EJB異常
- 13. 如何在JSF/EJB應用程序中存儲應用程序參數?
- 14. 當通過JSF + EJB應用程序持久化時,在數據庫中獲取null參數
- 15. 如何捕獲wxPython應用程序中的所有異常?
- 16. 如何捕獲所有異常/崩潰在.NET應用程序
- 17. 在應用程序啓動時捕獲異常(VS.Net)
- 18. 終止應用程序由於未捕獲的異常「NSInvalidArgumentException」 - 在
- 19. 如何在ios中捕獲數據庫異常?
- 20. 應用程序或應用程序是否應該捕獲錯誤異常?
- 21. ASP.Net C#4.0 - 如何捕獲應用程序線程異常
- 22. 捕獲用於登錄C++ CLI應用程序的異常
- 23. Swift:用NSExeption未捕獲的異常終止應用程序?
- 24. 如何在異常中捕獲異常?
- 25. happstack-lite處理程序捕獲異常
- 26. 在Springboot應用程序中使用monad來捕捉異常
- 27. VC++應用程序中的全局未捕獲異常處理程序?
- 28. 從winforms應用程序捕獲wcf異常的最佳實踐
- 29. 由於未捕獲的異常而終止應用程序NSInvalidArgumentException
- 30. 由於未捕獲異常'NSUnknownKeyException'而終止應用程序
謝謝你讓我知道,我不知道這是如何工作。順便說一句,這就是爲什麼我寫了據我所知。 – 2012-03-20 20:33:36