弹簧自动装配组件的异常处理

时间:2014-09-03 16:20:56

标签: spring exception-handling

我们有一个分层架构,希望在应用服务层控制异常处理。它下面的层将抛出必要的异常,但服务层将为外观层提供包装器,因此外观层可以期望一致的异常类。

但是,服务层使用自动装配的组件,基本上所有错误都包含在spring异常(和hibernate)类中。由于这不是方法级别,我如何将它们包装到一致的服务级别异常类中?关于服务层如何控制Spring异常类中包含的异常的任何想法。如果这个问题听起来太模糊,我很抱歉,但如果需要,我可以提供更多细节。我们没有使用spring MVC。

以下示例:

@Service("RuleService")
@Transactional
public class RuleService implements IRuleService  {

    @Autowired
    IPersistenceManager<IRuleBO, Long> pMgrRule;

    public AppServiceResponse createRule(RuleDTO ruleDTO) throws ApplicationException, ServerException {
    try {
        //do something
    }
    catch (PersistenceException pe) {
        throw new ApplicationException (pe);
    }
    catch (ServerException se) {
        throw se;
    }
    catch (Exception e) {
        throw new ApplicationException (e);
    }

在持久层,它就像..

@Transactional
public T save(T entity) throws ServerException, PersistenceException {
    try {
        getSession().saveOrUpdate(entity);
        return entity;
    }
    catch (JDBCException je) {
        throw new PersistenceException(je);
    }
    catch (QueryException qe) {
        throw new PersistenceException(qe);
    }
    catch (NonUniqueResultException nre) {
        throw new PersistenceException(nre);
    }
    catch (HibernateException he) {
        throw new ServerException(he);
    }
}

如您所见,我们希望从服务层返回ApplicationException。但是,由于组件是自动装配的,因此任何数据库连接错误都会导致SpringException中包含HibernateException。有没有办法控制Spring的异常?

1 个答案:

答案 0 :(得分:3)

我不会声明任何额外的例外,只要你以后不想处理它们就这样......

@Service("RuleService")
@Transactional
public class RuleService implements IRuleService  {

    @Autowired
    IPersistenceManager<IRuleBO, Long> pMgrRule;

    public AppServiceResponse createRule(RuleDTO ruleDTO) throws ApplicationException {
        //
        persistenceService.save(myEntity);
    }

和持久性如

@Transactional
public T save(T entity){
   getSession().saveOrUpdate(entity);
}

然后你可以创建一个ExceptionHandler方面来处理服务层的所有异常并将它们包装到ApplicationException

@Aspect
public class ExceptionHandler {

@Around("execution(public * xxx.xxx.services.*.*(..))")
public Object handleException(ProceedingJoinPoint joinPoint) throws Throwable {

Object retVal = null;

try {
  retVal = joinPoint.proceed();
}
catch (JDBCException jDBCException ) {
  throw new ApplicationException(jDBCException);
}
catch (JpaSystemException jpaSystemException) {
  throw new ApplicationException(jDBCException);
}
// and others

return retVal;

}

这种设计可以降低代码复杂性。您可能会欣赏这一点,特别是在项目的测试阶段。您还有一个清晰的设计和一个特殊组件,仅用于处理异常。