簡體   English   中英

Bean在Spring 4.2.5中沒有在ContextRefreshedEvent上獲得事務代理

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM