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..*.*(..))
должно заставить это работать.