Vorrei utilizzare le transazioni eseguite in aspetti dell'aplicazione di avvio di primavera, ma per la maggior parte ho trovato aiuto per più configurazioni "ordinarie" ...Come configurare l'applicazione di avvio a molla per utilizzare le transazioni aspectj?
Che cosa sono riuscito a impostare fino ad ora?
io ho tali annotazioni sulla classe principale:
@SpringBootApplication
@EnableTransactionManagement(mode=AdviceMode.ASPECTJ)
@EnableLoadTimeWeaving(aspectjWeaving=AspectJWeaving.ENABLED)
e questo nelle mie proprietà: applicazione
spring.jpa.properties.hibernate.current_session_context_class=org.springframework.orm.hibernate4.SpringSessionContext
Sto iniziando con agenti java molla strumento e aspectj tessitore e Riesco a vedere gli aspetti in stacktrace in cui ho usato @Transactional
quindi almeno questo funziona.
Inoltre, ciò che è davvero strano, problema è iniziato solo dopo che ho aggiunto seconda entità - prima ha lavorato senza problemi, ma ora sto avendo questo errore:
org.hibernate.HibernateException: Could not obtain transaction-synchronized Session for current thread
Da quello che ho notato è BeanFactory null
quando invokeWithinTransaction
viene eseguito su TransactionAspectSupport
- ma è in fase di impostare durante la creazione di fagioli (e da quello che ho visto in debug quando beanFactory
è null
TransactionAspectSupport
non si avviare una transazione, perché non è in grado di ottenere TransactionManager
). Immagino che l'istanza non bean di TransactionAspectSupport
venga creata ad un certo punto e che possa essere la ragione del mio problema (ma come e perché?)?
Aggiornamento:
Da quello che ho notato @Transactional
è gestita da AnnotationTransactionAspect
in un caso, ma da JtaAnnotationTransactionAspect
in un altro.
Qualche idea di cosa mi manca? Forse qualche proprietà magica che dovrei impostare?
Oh, e qui ci sono le mie dipendenze, se questo è importante:
<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>
Non è necessario impostare il contesto di sessione corrente, come già fatto in primavera. Inoltre stai usando il normale hibernate o JPA? Puoi anche pubblicare come stai avviando l'applicazione. –
Beh ... lo avvio semplicemente eseguendo la classe principale che ha 'SpringApplication.run (Application.class, args);' nel metodo principale e le annotazioni menzionate in questione. Niente di particolare, dal momento che cerco di mantenere le mie modifiche al minimo richiesto. EDIT: anche, lo eseguo con due -javaagent, impostato come descritto in questione. – korda