[英]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;
}
與評論您的問題的其他人一樣 - 我也認為您在帖子中的解決方案很糟糕。 存儲庫抽象的唯一目的是隱藏持久性機制,以便客戶端不必了解它。 在你的情況下,你尋找一個低級SQL異常,它被Spring和JPA有意地抽象出來。
如果您確實想要處理約束違規, DataIntegrityViolationException
是要捕獲的正確的。 存儲庫將在Spring DataAccessException
子類型中包裝特定於商店(MongoDB,JPA,無論您使用什么),以允許客戶端完全執行此操作:捕獲每個錯誤類型的異常,而不是每個持久性機制。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.