我们在我们的应用程序中使用 JSF、Spring 和 JPA。我们正在努力简化我们项目的异常处理策略。
我们的应用架构如下:
UI(JSF) --> 托管 Beans --> 服务 --> DAO
我们正在为 DAO 层使用异常翻译 bean 后处理器。这是在 Spring Application Context 文件中配置的。
<bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor" />
Spring将所有数据库异常包装到'org.springframework.dao.DataAccessException'。我们没有在 DAO 层中进行任何其他异常处理。
我们处理异常的策略如下:
表示层:
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
}
}
问题: 我们只是想确认上述方法是否符合最佳实践。如果没有,请建议我们处理异常的最佳方法(玩交易管理)?