2015-12-15 28 views
6

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 è nullTransactionAspectSupport 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> 
+0

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

+0

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

risposta

1

Ok. Sono un idiota, che non ha guardato cosa sta facendo l'autoimport.

Ho usato org.springframework.transaction.annotation.Transactional in un posto e javax.transaction.Transactional in un altro.

Dopo aver modificato tutto in primavera fornito @Transactional ha iniziato a funzionare.

Problemi correlati