[英]Bean gets no transactional proxy on ContextRefreshedEvent in Spring 4.2.5
我有一個bean(SettingService),它使用@Transactional注釋進行修飾,並注入另一個bean,在上面刷新的事件中調用此bean。
public class DefaultConfigManager
implements ApplicationListener<ContextRefreshedEvent>, ConfigManager {
@Autowired
private SettingService service;
@Override
public void onApplicationEvent( ContextRefreshedEvent event ) {
System.out.println( "Proxy: " + AopUtils.isJdkDynamicProxy( service ) );
String key = service.getSystemSetting( "KEY" );
}
事務通常工作良好,上面的方法在Spring 4.1.9中按預期工作,其中println指示SettingService bean是動態JDK代理(用於事務處理)。
升級到Spring 4.2.5之后,這突然開始拋出以下錯誤:
org.hibernate.HibernateException:無法獲取當前線程的事務同步會話
在org.springframework.orm.hibernate4.SpringSessionContext。 currentSession(SpringSessionContext.java:134)
在org.hibernate.internal.SessionFactoryImpl。 的getCurrentSession(SessionFactoryImpl.java:993)
並且println表示SettingService不再是代理/已經過裝飾,這意味着不會啟動任何事務。
根據Spring文檔,在發布ContextRefreshedEvent時,應該完成所有bean和后處理器。
在應用程序上下文中配置了Hibernate事務管理器,tx:annotation-driven元素就位,@Transactional注釋放在實現(而不是接口)上,系統中沒有循環依賴。 Hibernate版本:4.2.20.Final。
這對任何人都響了嗎? 是否有任何典型的原因導致為什么bean不再應該在Spring 4.2中的ContextRefreshedEvent上用事務代理? 春季4.1和4.2之間的任何常見錯誤或變化都要注意?
我遇到了同樣的問題。 我的解決方法是,在類級別而不是方法級別上放置@Transactional注釋。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.