簡體   English   中英

Spring數據異常處理

[英]Spring Data Exception Handling

我正在使用Spring Data-JPA開發一個項目。 我需要在JpaRepository方法調用中處理一些異常。

在下面的代碼中,我需要攔截主鍵違規錯誤,但我無法直接捕獲異常。 在我的例子中,當發生這種異常時,存儲庫層(JpaRepository)拋出UnexpectedRollbackException異常。 我需要在此異常對象內搜索以確定問題的原因。

我想知道是否有更“優雅”的方式來實現這一目標。

public Phone insert(Phone phone) throws BusinessException {
    Phone result = null;
    try{
        result = phoneRepository.save(phone);
    }
    catch(UnexpectedRollbackException ex){
        if((ex.getCause() != null && ex.getCause() instanceof RollbackException) &&
           (ex.getCause().getCause() != null && ex.getCause().getCause() instanceof PersistenceException) && 
           (ex.getCause().getCause().getCause() != null && ex.getCause().getCause().getCause() instanceof ConstraintViolationException)){
                throw new BusinessException("constraint violation", ex);
        }
    }
    catch(Exception ex){
        throw new OuvidorNegocioException("unknown error", ex);
    }       
    return result;
}

謝謝!

更新:

下面的代碼似乎要好得多。

public Phone insert(Phone phone) throws BusinessException {
    Phone result = null;
    try{
        result = phoneRepository.save(phone);
    }
    catch(UnexpectedRollbackException ex){
        if(ex.getMostSpecificCause() instanceof SQLIntegrityConstraintViolationException){
                throw new BusinessException("constraint violation", ex);
        }
    }
    catch(Exception ex){
        throw new OuvidorNegocioException("unknown error", ex);
    }       
    return result;
}

無論你在哪里處理異常,你必須尋找到的選項getMostSpecificCause()getRootCause()方法UnexpectedRollbackException 以下是有關這些方法的信息

與評論您的問題的其他人一樣 - 我也認為您在帖子中的解決方案很糟糕。 存儲庫抽象的唯一目的是隱藏持久性機制,以便客戶端不必了解它。 在你的情況下,你尋找一個低級SQL異常,它被Spring和JPA有意地抽象出來。

如果您確實想要處理約束違規, DataIntegrityViolationException是要捕獲的正確的。 存儲庫將在Spring DataAccessException子類型中包裝特定於商店(MongoDB,JPA,無論您使用什么),以允許客戶端完全執行此操作:捕獲每個錯誤類型的異常,而不是每個持久性機制。

暫無
暫無

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

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