Spring und AOP: Annotations werden ignoriert

Studdi23

Mitglied
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.

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]
 
Versuch das mal:

[xml]

<context:annotation-config />

<tx:annotation-driven transaction-manager="transactionManager"/>

<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory"></property>
</bean>

<bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor"></bean>

[/xml]
 
Hi,

danke erstmal für die Antwort. Also wenn ich das so in meine Konfiguration kopiere erhalte ich bei
[XML]<context:annotation-config />[/XML] folgende Fehlermeldung:
"The prefix 'context' for element context:annotation-config is not bound"
Weiterhin kann "entityManagerFactory" nicht referenziert werden, da keine Bean mit entsprechender 'id' existiert auf die verwiesen werden kann. Und der PersistenceAnnotationBeanPostProcessor wird auch nirgends genutzt, also z.B. als Attribut oder Referenz. Fehlt da vielleicht noch was in deinem Code?

Gruß
Mario
 
Hi,

wichtig sind glaube ich nur die ersten beiden Zeilen von rail.

Ich denke du musst den Namespace für Context noch in die xml einbinden. Zum Beispiel könnte das <beans> Element der xml so aussehen:

[XML]<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/context/spring-context-2.5.xsd">[/XML]

Den Teil für Context kannst du dir mal klauen.

Grüße
 
Zuletzt bearbeitet:
Weiterhin kann "entityManagerFactory" nicht referenziert werden, da keine Bean mit entsprechender 'id' existiert auf die verwiesen werden kann.

Wie ich sehe ist das ne schicht drüber (also eine Schicht über der JPA/wasauchimmer schicht). Wie hast du denn da deinen transactionManager erzeugt? bzw. woher bekommst du ihn?

Auch in deiner ürsprünglichen Konfiguration wo

[xml]
<tx:advice id="txAdvice" transaction-manager="transactionManager">
[/xml]

steht.

"The prefix 'context' for element context:annotation-config is not bound"

Nehm den namespace von MySelV.

Und der PersistenceAnnotationBeanPostProcessor wird auch nirgends genutzt, also z.B. als Attribut oder Referenz. Fehlt da vielleicht noch was in deinem Code?

Der muss nirgends verwendet werden, da er lediglich die annotations @PersistenceContext etc. "verarbeitet".

Aber da es sich ja um ne Schicht drüber handelt, vergiss ihn 🙂
 
Super!! Das hat geklappt 😀 Es waren nur die ersten beiden Zeilen und der Namespace notwendig, wie MySelV schon sagte. Vielen Dank euch beiden!!

Gruß
Mario
 

Zurück
Oben