Spring AOP оформление заказа - сделки перед посоветуйте - PullRequest
1 голос
/ 17 февраля 2011

Я пишу несколько советов и хочу, чтобы транзакции были зафиксированы до того, как они дойдут до совета. Похоже, что это работает для сохранения и удаления, но когда я обновляюсь, он выполняет тщательный совет, а затем выдает исключение.

try {
    retVal = pjp.proceed();
} catch (Exception e) {
    PSPSFaultException fault = new PSPSFaultException(e);
    pmLog.error(ERR_MSG, fault);
    throw fault;
}

Как вы можете видеть здесь, я пытаюсь обернуть исключения в наше собственное исключение времени выполнения.

Я пытался заказать:

<tx:annotation-driven transaction-manager="txManager" order="1"/>

и

@Around( "execution(* blah.blah.PersistenceProvider.*(..))")
@Order(value=2)
public Object persistenceWrapper(ProceedingJoinPoint pjp) throws Throwable {

но, похоже, это не имеет никакого значения для стека или функциональности.

@Transactional(propagation = Propagation.REQUIRED)
public class PersistenceProviderImpl extends HibernateDaoSupport implements  PersistenceProvider {

@Override
public void update(Object o) {
    this.getHibernateTemplate().update(o);
}

Есть ли способ заставить обновление сработать перед советом? Транзакции находятся на уровне дао ...

Ответы [ 2 ]

8 голосов
/ 24 августа 2011

Хорошо, значит, вы делаете 2 вещи неправильно:

  1. Вы должны иметь меньшее значение рядом с вашими советами и большее значение рядом с менеджером транзакций (более высокий приоритет для советов, выполняется первым - более низкий приоритет для транзакциименеджер, выполненный позже)
  2. Yous должен поставить @Order(1) аннотацию перед целым @Aspect классом (странно, но у меня работает)

Примерно так:

...
<tx:annotation-driven transaction-manager="txManager" order="200"/>  
...
@Order(1)
@Aspect
public class MyAspect {
...
1 голос
/ 28 мая 2014

В моем случае вышеупомянутый совет не работал. Я использую время компиляции с Maven, так что это может быть причиной.

Моя цель состояла в том, чтобы обработать исключения базы данных после завершения транзакции и превратить их в другое исключение.

Мне пришлось включить в один из файлов Aspect (думаю, какой из них не имеет значения):

@DeclarePrecedence(value = "*..*TransactionException*,     org.springframework.transaction.aspectj.AbstractTransactionAspect, *..*Logging*, *")
...