2014-09-23 19 views
6

Sto cercando di capire dove è il posto giusto per inserire l'annotazione @EnableTransactionManagement in caso di più contesti JavaConfig?Qual è lo scopo di @EnableTransactionManagement?

Considerare il seguente scenario: Ho JPA config in JPAConfig.java e AppConfig.java con set di bean di servizio. Quindi compongo la configurazione generale dell'applicazione in RootConfig.java.

Definisco il gestore delle transazioni all'interno di JPAConfig.java e abilito la scansione per i repository JPA - come quelli che espongono il comportamento delle transazioni, ho inserito @EnableTransactionManagement su JPAConfig e funziona.

Tuttavia, alcuni dei bean di servizio devono anche disporre di metodi transazionali, ad es. accesso a diversi repository all'interno di una singola transazione. Devo inserire anche @EnableTransactionManagement su AppConfig? Guardando all'implementazione di questa annotazione mi sembra che un simile approccio possa causare la ridefinizione di alcuni bean. E in realtà farlo non sembra funzionare per me.

@Configuration 
@EnableTransactionManagement 
@EnableJpaRepositories("com.mypackage.repositories") 
public class JPAConfig { 
// ... here are EntityManager and PlatformTransactionManager beans 
} 


@Configuration 
@ComponentScan("com.mypackage.services") 
// @EnableTransactionManagement // - ??? 
public class AppConfig { 
} 

@Configuration 
@Import({AppConfig.class, JPAConfig.class}) 
public class RootConfig { 
} 

Apprezzare qualsiasi consiglio.

+1

Questa annotazione aggiunge elementi di gestione delle transazioni all'intero contesto dell'applicazione. Questo è il suo scopo. –

+1

Ma non sembra abilitare l'elaborazione delle annotazioni di transazione per RootConfig in generale. Almeno, non funziona per me. –

risposta

10

Dopo alcuni esperimenti mi sembra di aver trovato la risposta me stesso:

  • Non v'è alcuna necessità di configurare @EnableTransactionManagement su ogni pezzo di configurazione del contesto, anche se non importa quanto presto questo annotazione è scoperto come si registra internalTransactionAdvisor che elabora effettivamente le annotazioni @Transactional sui bean creati.
  • Nel mio caso, ho cambiato l'ordine dei contesti in @Import dichiarazione in modo che PersistenceConfig che tiene @EnableTransactionManagement è il prima. Dopo che i fagioli di altri pezzi possono utilizzare la transazione dichiarativa di AOP.
  • Un'altra avvertenza riguarda l'uso simultaneo di @EnableTransactionManagement e @EnableGlobalMethodSecurity. La sicurezza del metodo globale utilizza la post-elaborazione dei bean che sembra richiedere il cablaggio di tutta la configurazione di sicurezza. BeanPostProcessors vengono creati in anticipo all'avvio del contesto, quindi non è possibile utilizzare il valore dichiarativo @Transactional in qualsiasi bean necessario per eseguire il bootstrap di sicurezza (nel mio caso UserDetailsContextMapper): l'advisor non è stato ancora creato!
+0

Come sei riuscito a ottenere Transactions con la tua configurazione di sicurezza di primavera? – Tarator

+0

È passato un po 'di tempo :) Per quanto mi ricordo, ho appena finito con una transazione programmatica. Era davvero un posto unico quando era necessario, quindi questa soluzione mi andava bene. –