我们有一个分层架构,希望在应用服务层控制异常处理。它下面的层将抛出必要的异常,但服务层将为外观层提供包装器,因此外观层可以期望一致的异常类。
但是,服务层使用自动装配的组件,基本上所有错误都包含在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的异常?
答案 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;
}
这种设计可以降低代码复杂性。您可能会欣赏这一点,特别是在项目的测试阶段。您还有一个清晰的设计和一个特殊组件,仅用于处理异常。