Spring управление транзакциями txAdvice

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

@Transactional (value = "actionDds", rollbackfor="Throwable")

Это отлично работает. Но так как у меня так много сервисов, я хочу переместить эту конфигурацию в XML (весенний контекстный файл DAO). Вот что я сделал:

<tx:advice id="txAdvice" transaction-manager="transactionManagerDds">
    <tx:attributes>
        <tx:method name="*" read-only="false" propagation="REQUIRED" rollback-for="Throwable"/>
    </tx:attributes>
 </tx:advice>
 <aop:config>
    <aop:pointcut id="transRollbackOp" expression="execution(*fr.def.iss.ult.moduleManagement.service.dds.*.*.*(..))"/>
    <aop:advisor advice-ref="txAdvice" pointcut-ref="transRollbackOp"/>
  </aop:config> 

  <bean id="transactionManagerDds" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">  
     <property name="dataSource" ref="beanDataSourceFactory" />  
      <qualifier value="transactionDds"/> 
  </bean>

Таким образом, в основном я являюсь менеджером транзакций, который связан с рекомендацией, которая откатывает возможные методы, когда возникает исключение Throwable. И этот совет связан с конфигурацией AOP таким образом, что мы указываем все интерфейсы на сервисном уровне приложения, к которому должна применяться эта конфигурация транзакции. Но это не работает. Транзакция не откатывается Возникает исключение. Я не понимаю, что это работает с аннотацией, но не с декларативной конфигурацией в XML.

Я с нетерпением жду ваших предложений. Я полностью заблокирован. Пожалуйста, помогите мне. Спасибо заранее.

1 ответ

<aop:config>
    <aop:pointcut id="transRollbackOp" expression="execution(*fr.def.iss.ult.moduleManagement.service.dds.*.*.*(..))"/>
    <aop:advisor advice-ref="txAdvice" pointcut-ref="transRollbackOp"/>
</aop:config>

В вашем <aop:config /> введенное вами выражение недопустимо. Это должно по крайней мере содержать пробел между * а также fr.def,

Далее вместо .*.*.* Я предлагаю писать ..*.* который выбирает все классы во всех подпакетах независимо от глубины.

Короче говоря, измените свое выражение на execution(* fr.def.iss.ult.moduleManagement.service.dds..*.*(..)) должно заставить это работать.

Другие вопросы по тегам