Эта проблема возникла после перехода с весны 4.1.2 на 5.0.5, пакета с пружиной на 3.0.9 до 4.0.1 и гибернации с 4.2.0 до 5.2.16. У меня есть тасклет весеннего пакета в формате -
public class MyTasklet implements Tasklet {
public RepeatStatus execute(StepContribution arg0, ChunkContext arg1) {
a();
}
public void a(){
//a few hibernate calls here
}
}
Теперь я хочу, чтобы границей моей транзакции гибернации был метод a () [вызывается из execute], а не метод execute ().Но когда я пытаюсь применить точечные сокращения для достижения того же, я получаю сообщение "транзакция не выполняется" .Я предоставил пример xml ниже.
В aop pointcut-вместо имени метода 'a' [то есть public * myPackage.MyTasklet.a(..)
], если я использую *
(то есть public * myPackage.MyTasklet.*(..)
] или 'execute'[то есть public * myPackage.MyTasklet.execute(..)
] код работает нормально. По некоторым техническим причинам важно иметь границу в 'a', из-за которой я не могу иметь 'execute' или любой другой метод в качестве границы.
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="*" propagation="REQUIRED" />
</tx:attributes>
</tx:advice>
<bean id="transactionManager"
class="org.springframework.orm.hibernate5.HibernateTransactionManager">
<property name="sessionFactory" ref="mySessionFactory" />
</bean>
<aop:config>
<aop:pointcut id="Op1"
expression="execution(public * myPackage.MyTasklet.a(..))" />
<aop:advisor advice-ref="txAdvice" pointcut-ref="Op1" />
</aop:config>