簡體   English   中英

Spring WebApp中的JPA異常處理

[英]JPA Exception Handling in Spring WebApp

我正在使用具有DAO,服務,控制器,視圖層的Spring Web應用程序。 JPA正在用於數據庫訪問。 我用於JPA異常處理的方法如下。

public class DBException extends RuntimeException {
   implemented constructors to call appropriate RuntimeException constructors.
}

public MyDAOClass {
   public void save(Object object) {
       try {
           entityManager.persist(object);
       }catch(PersistenceException e) {
           throw new DBException("Error occurred in save", e);
       }
   }
}

public class MyServiceClass {
    public void serviceMethod() {
        dao.save(object);
    }
}

public class MyRestController {
    public void controllerMethod() {
        service.save();
    }
    @ExceptionHandler(DBException.class)
    public String handleDBException(DBException e, HttpServletRequest req) {
        implemented code to log & handle exception.
    }

}

我想了解有關該異常的更多信息,這是創建自定義DBException的原因,而且我也不想將PersistenceException傳播到其他層。

  1. 這是正確的異常處理方法嗎?

  2. 我應該在所有層中記錄異常還是在控制器的末尾記錄異常是好的?

  3. 我正在捕獲PersistenceException並重新拋出DBException 由於DBExceptionRuntimeException我認為Spring事務應該在發生異常時回滾嗎?

謝謝。

這是正確的異常處理方法嗎?

是的,永遠不要將特定於該層的異常傳播到其上一層。 如果您希望數據層的客戶端從異常中恢復過來,請創建一個新的自定義檢查異常,並將其從save方法的catch塊中拋出。

我應該在所有層中記錄異常還是在控制器的末尾記錄異常是好的?

日志記錄只能在一個地方進行,因為在多個級別進行日志記錄會使程序員檢查堆棧跟蹤有關原始異常源的方法感到困惑。 在這種情況下,我認為最好將SQLException記錄在save方法的catch塊中,因為您要拋出RuntimeException,所以save方法的調用者不一定會捕獲異常並將其記錄下來。

我正在捕獲PersistenceException並重新拋出DBException。 由於DBException是RuntimeException,我認為Spring事務應該在發生異常時回滾嗎?

是的,如果發生RuntimeException,Spring事務將回滾。 這是因為在發生RuntimeException的情況下,調用者代碼無法做很多事情,因為它代表了不可恢復的條件。 此行為在Docs中定義。

有關異常處理最佳實踐的更多信息,請點擊此處

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM