Frühjahr / @Transactional mit AspectJ wird Total ignoriert
Ich benutze Spring-Data-Neo4j 2.2.0-RELEASE. (bei mir ist folgende Problem, wäre für jede andere Art von entity mapping, warum nicht, JPA)
In meinem Projekt habe ich eine öffentliche Methode annotiert mit @Transactional
Frühjahr Kommentar, da möchte ich aktualisieren/speichern eines entity-innen:
public class MeetingServices {
private UserRepository userRepository;
private MeetingRepository meetingRepository;
public void setUserRepository(UserRepository userRepository) {
this.userRepository = userRepository;
}
public void setMeetingRepository(MeetingRepository meetingRepository) {
this.meetingRepository = meetingRepository;
}
@Transactional("neo4jTransactionManager")
public void save(Meeting meeting) {
User creator = userRepository.getUserByEmail("[email protected]");
creator.participateIn(meeting); //this line leads to a NotInTransactionException since it signals that no transaction context is associated.
meeting.setCreator(creator);
}
Meine application-context.xml ist die folgende:
<?xml version="1.0" encoding="UTF-8"?>
<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"
xmlns:neo4j="http://www.springframework.org/schema/data/neo4j"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/data/neo4j
http://www.springframework.org/schema/data/neo4j/spring-neo4j.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">
<bean id="graphDatabaseService" class="org.neo4j.kernel.EmbeddedGraphDatabase">
<constructor-arg value="target/neo4jgraph" />
</bean>
<neo4j:config graphDatabaseService="graphDatabaseService" />
<bean id="meetingServices" class="services.MeetingServices">
<property name="userRepository"><ref bean="userRepository"/></property>
<property name="meetingRepository"><ref bean="meetingRepository"/></property>
</bean>
<bean id="userServices" class="services.UserServices">
<property name="userRepository"><ref bean="userRepository"/></property>
</bean>
<bean id="neo4jTransactionManager"
class="org.springframework.transaction.jta.JtaTransactionManager">
<property name="transactionManager">
<bean class="org.neo4j.kernel.impl.transaction.SpringTransactionManager">
<constructor-arg ref="graphDatabaseService" />
</bean>
</property>
<property name="userTransaction">
<bean class="org.neo4j.kernel.impl.transaction.UserTransactionImpl">
<constructor-arg ref="graphDatabaseService" />
</bean>
</property>
</bean>
<tx:annotation-driven mode="aspectj"
transaction-manager="neo4jTransactionManager" />
<!-- auto-generated repositories for Neo4j storage -->
<neo4j:repositories base-package="repositories"/>
<context:spring-configured/>
<context:annotation-config/>
</beans>
Wie wir sehen, in dieser Konfiguration, aspectJ verwendet wird, für Transaktionen.
So, ich habe versucht zu testen, eine andere Art und Weise zu tun, indem Sie meinen application-context.xml die Verwendung der proxy
Funktion anstelle von aspectJ
feature:
<?xml version="1.0" encoding="UTF-8"?>
<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"
xmlns:neo4j="http://www.springframework.org/schema/data/neo4j"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/data/neo4j
http://www.springframework.org/schema/data/neo4j/spring-neo4j.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">
<bean id="graphDatabaseService" class="org.neo4j.kernel.EmbeddedGraphDatabase">
<constructor-arg value="target/neo4jgraph" />
</bean>
<neo4j:config graphDatabaseService="graphDatabaseService" />
<bean id="meetingServices" class="services.MeetingServices">
<property name="userRepository"><ref bean="userRepository"/></property>
<property name="meetingRepository"><ref bean="meetingRepository"/></property>
</bean>
<bean id="userServices" class="services.UserServices">
<property name="userRepository"><ref bean="userRepository"/></property>
</bean>
<tx:annotation-driven mode="proxy" />
<neo4j:repositories base-package="repositories"/>
<context:spring-configured/>
<context:annotation-config/>
</beans>
Diese Konfiguration funktioniert ziemlich gut, da @Transactional
(deren neo4jTransactionManager
parameter wurde natürlich entfernt) - Anmerkung ist jetzt in der Rechnung für meinen service ' s Methode.
Meine Frage ist, (egal ob zu meinem Projekt arbeiten würde, mit einfachen proxy
- Methode):
Hab ich was verpasst oder misconfigure in meinem ersten Spring-Konfiguration, die macht aspectJ Transaktion features gescheitert?
Ich bin derzeit auf der Verbesserung meiner technischen Fähigkeiten mit der Feder, und Lesen Sie einige Artikel, die über die "Load-time weaving" für aspectJ. Könnte dies im Zusammenhang mit meiner Frage?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Versuchen Sie
<context:load-time-weaver/>
zu ermöglichen load-time weaving und fügen Sie die spring-aspects.jar zu den classpath.Sehen http://static.springsource.org/spring/docs/current/spring-framework-reference/html/aop.html#aop-aj-ltw-spring für mehr info
Bearbeiten
Für generische java-Anwendungen, also nicht die Ausführung in einem web-oder application-container, müssen Sie zum aktivieren von java-instrumentatioin über ein option-javaagent:
Wenn Sie wollen, Weben Ihre eigenen Aspekte, die Sie brauchen, um eine META-INF/aop.xml Datei mit dem Aspekt Erklärungen. (Nicht erforderlich für den Frühling nur Aspekte, die es schon auf spring-aspect.jar).
Schließlich können Sie compile time weaving statt, mithilfe des maven-aspectj-plugin, zum Beispiel:
Caused by: java.lang.IllegalStateException: ClassLoader [sun.misc.Launcher$AppClassLoader] does NOT provide an 'addTransformer(ClassFileTransformer)' method. Specify a custom LoadTimeWeaver or start your Java virtual machine with Spring's agent: -javaagent:org.springframework.instrument.jar
java.lang.VerifyError: (class: services/MeetingServices$$EnhancerByCGLIB$$73b088b5, method: setMeetingRepository signature: (Lrepositories/MeetingRepository;)V) Inconsistent stack height 1 != 0
. Klingt wie ein bekannter bug (stackoverflow.com/questions/9027009/aspectj-verifyerror). Ich benutze Java 7 .. ich habe einfach versucht, den Rat: hinzufügen-XX:-UseSplitVerifier
VM-Optionen, aber Fehler immer noch Auftritt.