我們在我們的應用程序中使用JSF,Spring和JPA。我們正在努力簡化我們項目的異常處理策略。Spring/JPA/JSF異常處理策略
我們的應用程序的體系結構是象下面這樣:
UI(JSF) - >管Bean - >服務 - > DAO
我們使用異常翻譯後豆處理器,用於DAO層。這是在Spring應用程序上下文文件中配置的。
<bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor" />
Spring將所有數據庫異常包裝爲'org.springframework.dao.DataAccessException'。我們沒有在DAO Layer中進行其他異常處理。
我們的策略來處理異常象下面這樣:
表示層:
Class PresentationManangedBean{
try{
serviceMethod();
}catch(BusinessException be){
// Mapping exception messages to show on UI
}
catch(Exception e){
// Mapping exception messages to show on UI
}
}
服務層
@Component("service")
Class Service{
@Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = BusinessException.class)
public serviceMethod(){
try{
daoMethod();
}catch(DataAccessException cdae){
throws new BusinessException(); // Our Business/Custom exception
}
catch(Exception e){
throws new BusinessException(); // Our Business/Custom exception
}
}
}
DAO層
@Repository("dao")
Class DAO{
public daoMethod(){
// No exception is handled
// If any DataAccessException or RuntimeException is occurred this
// is thrown to ServiceLayer
}
}
問: 我們只是想確認上述做法是否按照最佳做法。如果沒有,請向我們建議處理異常情況的最佳方法(使用交易管理)?
我也想遵循這個認識,但是當我捕捉到異常並拋出我們的自定義異常時,我的異常處理程序不會出現這種情況。 Spring將我的異常包裝到'org.springframework.transaction.TransactionSystemException'中。這是我的問題http://stackoverflow.com/questions/28295684/unable-to-wrap-dao-exception-in-service-layer-using-spring-mvc。我如何解決我的問題? –