2015-12-15 22 views
6

Chciałbym użyć transakcji wykonanych przez aspekty w aplikacji wiosennego rozruchu, ale jak dotąd w większości znalazłem pomoc dla bardziej "zwykłych" konfiguracji ...Jak skonfigurować wiosenny program startowy do korzystania z transakcji typu aspectj?

Co udało mi się stworzyć do tej pory?

Mam te adnotacje na główne klasy:

@SpringBootApplication 
@EnableTransactionManagement(mode=AdviceMode.ASPECTJ) 
@EnableLoadTimeWeaving(aspectjWeaving=AspectJWeaving.ENABLED) 

i to w moich właściwości:

spring.jpa.properties.hibernate.current_session_context_class=org.springframework.orm.hibernate4.SpringSessionContext 

Zaczynam aplikacja z agentami java wiosny instrumentu i AspectJ tkacza i Widzę aspekty w stosach, w których użyłem @Transactional, więc przynajmniej to działa.

Ponadto, co jest bardzo dziwne, Problem rozpoczął się dopiero po dodaniu drugiego podmiotu - pierwszy pracował bez problemu, ale teraz mam ten błąd:

org.hibernate.HibernateException: Could not obtain transaction-synchronized Session for current thread 

Z tego co zauważyłem to beanFactory null gdy invokeWithinTransaction prowadzony jest na TransactionAspectSupport - ale to jest ustawione podczas tworzenia fasoli (iz tego co widziałem w debugowania, gdy beanFactory jest nullTransactionAspectSupport nie rozpocznie transakcję, ponieważ nie jest w stanie uzyskać TransactionManager). Wydaje mi się, że w pewnym momencie powstaje przypadek non-bean TransactionAspectSupport i może to być przyczyną mojego problemu (ale jak i dlaczego?)?

Aktualizacja:

Z tego co zauważyłem @Transactional jest obsługiwane przez AnnotationTransactionAspect w jednym przypadku, ale przez JtaAnnotationTransactionAspect w innym.

Jakieś pomysły, których mi brakuje? Może jakąś magiczną właściwość powinienem ustawić?

Aha, i tutaj są moje zależności, czy to jest ważne:

<dependencies> 
    <dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-aop</artifactId> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-data-jpa</artifactId> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-freemarker</artifactId> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-jdbc</artifactId> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-web</artifactId> 
    </dependency> 
    <dependency> 
     <groupId>com.h2database</groupId> 
     <artifactId>h2</artifactId> 
    </dependency> 
    <dependency> 
     <groupId>com.google.guava</groupId> 
     <artifactId>guava</artifactId> 
     <version>18.0</version> 
    </dependency> 
    <dependency> 
     <groupId>commons-io</groupId> 
     <artifactId>commons-io</artifactId> 
     <version>2.4</version> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-test</artifactId> 
     <scope>test</scope> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-instrument</artifactId> 
     <scope>provided</scope> 
    </dependency> 
    <dependency> 
     <groupId>org.aspectj</groupId> 
     <artifactId>aspectjrt</artifactId> 
     <version>1.8.7</version> 
    </dependency> 
    <dependency> 
     <groupId>org.aspectj</groupId> 
     <artifactId>aspectjweaver</artifactId> 
     <version>1.8.7</version> 
    </dependency> 
</dependencies> 
+0

Nie trzeba ustawiać aktualnego kontekstu sesji, ponieważ jest to już zrobione przez sprężynę. Czy używasz zwykłej hibernacji lub JPA? Czy możesz również opublikować, w jaki sposób uruchamiasz aplikację? –

+0

Cóż ... Zaczynam od tego po prostu uruchamiając główną klasę, która ma "SpringApplication.run (Application.class, args);" w głównej metodzie i adnotacjach wspomnianych w pytaniu. Nic nadzwyczajnego, ponieważ staram się zachować moje modyfikacje do wymaganego minimum. EDYCJA: również, uruchomię go z dwoma -javaagent, ustawić jak opisano w pytaniu. – korda

Odpowiedz

1

Ok. Jestem idiotą, który nie sprawdził, co robi autoimport.

Użyłem org.springframework.transaction.annotation.Transactional w jednym miejscu i javax.transaction.Transactional w innym.

Po zmianie wszystkiego na wiosnę pod warunkiem, @Transactional zaczęło działać.