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 null
TransactionAspectSupport
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>
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ę? –
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