2014-09-23 64 views
6

Birden çok JavaConfig bağlamında @EnableTransactionManagement ek açıklamasını yerleştirmek için doğru yer nerede anlamaya çalışıyorum?@EnableTransactionManagement'ın kapsamı nedir?

Aşağıdaki senaryoyu düşünün: JPAConfig.java ve AppConfig.java'da hizmet çekirdeklerinden oluşan JPA yapılandırm var. Sonra RootConfig.java'da genel uygulama yapılandırması oluşturuyorum.

JPAConfig.java içindeki işlem yöneticisini tanımlamanın yanı sıra JPA depoları için tarama işlemini etkinleştiririm - işlem davranışları ortaya çıktıkça, JPAConfig üzerinden @EnableTransactionManagement koyarım ve çalışır. Bununla birlikte, bazı servis çekirdeklerinin, aynı zamanda işlem yöntemlerine de sahip olması gerekmektedir. tek bir işlem içinde çeşitli depolara erişim. AppConfig üzerinden de @EnableTransactionManagement koymalı mıyım? Bu açıklamanın uygulanışına bakıldığında, böyle bir yaklaşımın bazı fasülyelerin yeniden tanımlanmasına neden olacağı görülmektedir. Ve aslında bunu yapmak benim için işe yaramıyor.

@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 { 
} 

Tüm önerileri takdir edin. Ben görünüyor bazı deneylerden sonra

+1

Bu ek açıklama, işlem yönetimi öğelerini tüm uygulama içeriğine ekler. Bu onun kapsamı. –

+1

Ancak, işlem ek açıklamalarının genel RootConfig için işlem görmesini sağlamaz. En azından benim için çalışmıyor. –

cevap

10

cevap verilmesi kendimi bulduğum için:

  • o kaydeder olarak bu açıklama keşfedilir ne kadar erken yapar rağmen bağlam konfigürasyonun her parçası üzerinde @EnableTransactionManagement yapılandırmak için gerek yoktur Oluşturulan çekirdeklerde @Transactional ek açıklamalarını işleyen internalTransactionAdvisor . Benim durumumda
  • , ben @EnableTransactionManagement tutan PersistenceConfig ilk yani olduğunu @Import bildiriminde bağlamlarda sırasını değiştirdi. Diğer parçalardan alınan bu fasülyenin ardından AOP deklarasyonu işlemi kullanılabilir.
  • Başka bir uyarı, @EnableTransactionManagement ve @EnableGlobalMethodSecurity'un eş zamanlı kullanımı ile ilgilidir. Global yöntem güvenliği, tüm güvenlik yapılandırmasının kablolu olmasını gerektirecek şekilde, fasülye sonrası işlemeyi kullanır. BeanPostProcessors, içerik başlangıcında erken oluşturulduğundan, @Transactional bildirgesini yay emniyetini önyüklemek için gerekli olan herhangi bir fasülyede kullanamazsınız (benim durumumda UserDetailsContextMapper) - danışman henüz oluşturulmamış!
+0

İlkbahar-güvenlik yapılandırmanızla İşlemleri nasıl almayı başardınız? – Tarator

+0

Şimdilik bir süredir :) Hatırladığım kadarıyla, programatik bir işlemle sonuçlandım. İhtiyaç duyulduğunda gerçekten tek bir yerdi, bu yüzden bu çözüm bana çok yakıştı. –