Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > Spring transaction-manager как поймать исключение.


Автор: alex_nevolin 24.9.2008, 12:31
Описание:
есть конфигурация:
Код

<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    <property name="sessionFactory" ref="sessionFactory"/>
</bean>

<tx:advice id="transactionAdvice" transaction-manager="transactionManager">
    <tx:attributes>
        <tx:method name="*" propagation="REQUIRES_NEW"/>
    </tx:attributes>
</tx:advice>

<aop:config>
    <aop:pointcut
            id="operation"
            expression="execution(* x.y.z.ExclusiveWriteLockManagerImpl.*(..))"
    />
    <aop:advisor
            advice-ref="transactionAdvice"
            pointcut-ref="operation" 
    />
</aop:config>

Есть код:
Код

public class ExclusiveWriteLockManagerImpl  implements ExclusiveWriteLockManager {

    public void acquireLock(Object entity, String session) throws ConcurrencyException{
        EntityLock lock = new EntityLock();
        //... инициализация lock
        try {
            getHibernateTemplate().save(lock);
        } catch (DataAccessException e) {
            throw new ConcurrencyException(e); 
        }
    }

    //..
}

Констрейн на таблице не дает создать два лока на одном entity. 
Но при этом ConstraintViolationException возникает в момент попытки фиксации транзакции, а не в методе acquireLock().
Знатоки Spring подскажите, пожалуйста, 
каким образом можно сконфигурировать Spring, что-бы ловить исключение возникшее в HibernateTransactionManager 
и мапить его на своё ConcurrencyException.

Хочется иметь честный контракт ExclusiveWriteLockManager с checked исключенем ConcurrencyException.
Спасибо.

Автор: alex_nevolin 24.9.2008, 13:43
Нашел решение:
Добавить еще адвизор и порядок вызова:
Код

<aop:advisor
        advice-ref="transactionAdvice"
        pointcut-ref="operation" order="2"
/>
<aop:advisor
         advice-ref="exceptionCatchOnCommitAdvice"
         pointcut-ref="operation" order="1" 
/>

<bean id="exceptionCatchOnCommitAdvice" class="x.y.z.CatchExceptionInterceptor"/>

Реализовать:
Код

public class CatchExceptionInterceptor implements ThrowsAdvice {

   public void afterThrowing(Method method, Object[] args, Object target, Throwable ex) throws Throwable {
       if (ex instanceof DataIntegrityViolationException && ex.getCause() instanceof ConstraintViolationException) {
           throw new ConcurrencyException(ex);
       } else {
           throw ex;
       }
   }
}

Осталься вопрос, есть ли другие способы? или этот правильный?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)