Hallo zusammen,
arbeite mich zur Zeit in Spring mit AspectJ ein und möchte statt XML-Definitionen Annotations in meinen Klassen benutzen. Hierfür habe ich in der Spring-Konfiguration folgendes Tag eingetragen um Annotations zu "aktivieren": [XML]<aop:aspectj-autoproxy />[/XML]
Jetzt möchte ich das Transaktionsverhalten bestimmter Methoden ändern z.B. ist für die Methode "getQueueTime" folgende Transaktion deklariert.
Wenn ich die folgende Testklasse ausführe findet aber trotz anderslautender Anweisung dennoch eine Transaktion statt, obwohl der Test fehlschlagen bzw. eine Exception geworfen werden müsste.
Kann mir jemand erklären, warum das so ist? Wenn ich das ganze als XML im Application-Context konfiguriere funktioniert es einwandfrei.
[XML]
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="get*" read-only="true" propagation="NEVER" />
</tx:attributes>
</tx:advice>
<aop:config>
<aop😛ointcut id="txOrderMethods"
expression="execution(* de.tutorial.opiz.service.OrderService*.*(..))" />
<aop:advisor advice-ref="txAdvice" pointcut-ref="txOrderMethods" />
</aop:config>[/XML]
arbeite mich zur Zeit in Spring mit AspectJ ein und möchte statt XML-Definitionen Annotations in meinen Klassen benutzen. Hierfür habe ich in der Spring-Konfiguration folgendes Tag eingetragen um Annotations zu "aktivieren": [XML]<aop:aspectj-autoproxy />[/XML]
Jetzt möchte ich das Transaktionsverhalten bestimmter Methoden ändern z.B. ist für die Methode "getQueueTime" folgende Transaktion deklariert.
Java:
@Transactional(propagation=Propagation.NEVER)
public int getQueueTime() {
List<Order> orders = orderDAO.getOrdersInState(OrderState.OPEN);
return 10 + orders.size() * 2;
}
Wenn ich die folgende Testklasse ausführe findet aber trotz anderslautender Anweisung dennoch eine Transaktion statt, obwohl der Test fehlschlagen bzw. eine Exception geworfen werden müsste.
Java:
public class TxDeclarativeTest extends
AbstractTransactionalDataSourceSpringContextTests {
OrderService orderService;
boolean isTxActive = false;
public void setOrderService(OrderService orderService) {
this.orderService = orderService;
}
@Override
protected void onSetUpBeforeTransaction() throws Exception{
isTxActive = false;
}
@Override
protected void onSetUpInTransaction() throws Exception{
isTxActive = true;
}
public void testAnnotatedTx() throws Exception{
int qTime = orderService.getQueueTime();
assertTrue(isTxActive);
assertTrue(0 < qTime);
}
@Override
protected void onTearDownAfterTransaction() throws Exception{
isTxActive = false;
}
protected String[] getConfigLocations() {
return new String[] { "orderServiceApp.xml" };
}
}
Kann mir jemand erklären, warum das so ist? Wenn ich das ganze als XML im Application-Context konfiguriere funktioniert es einwandfrei.
[XML]
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="get*" read-only="true" propagation="NEVER" />
</tx:attributes>
</tx:advice>
<aop:config>
<aop😛ointcut id="txOrderMethods"
expression="execution(* de.tutorial.opiz.service.OrderService*.*(..))" />
<aop:advisor advice-ref="txAdvice" pointcut-ref="txOrderMethods" />
</aop:config>[/XML]