gpt4 book ai didi

java - Bean 在 Spring 4.2.5 的 ContextRefreshedEvent 上没有事务代理

转载 作者:搜寻专家 更新时间:2023-11-01 03:19:16 24 4
gpt4 key购买 nike

我有一个 bean (SettingService),它用 @Transactional 注释装饰并注入(inject)到另一个 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: Could not obtain transaction-synchronized Session for current thread

at org.springframework.orm.hibernate4.SpringSessionContext. currentSession(SpringSessionContext.java:134)

at org.hibernate.internal.SessionFactoryImpl. getCurrentSession(SessionFactoryImpl.java:993)

并且println表示SettingService不再是代理/已经被修饰,意味着不会发起任何事务。

根据 Spring 文档,在发布 ContextRefreshedEvent 时,所有 beans 和后处理器都应该完成。

在应用程序上下文中配置了一个 Hibernate 事务管理器,tx:annotation-driven 元素就位,@Transactional 注释放在实现(而不是接口(interface))上,系统中没有循环依赖。 hibernate 版本:4.2.20.Final。

这会引起任何人的注意吗?在 Spring 4.2 中,为什么不再使用 ContextRefreshedEvent 上的事务代理 bean 有什么典型的原因吗?需要注意 Spring 4.1 和 4.2 之间的任何常见错误或更改?

最佳答案

我遇到了和你一样的问题。我的解决方法是,将 @Transactional 注释放在类级别而不是方法级别。

关于java - Bean 在 Spring 4.2.5 的 ContextRefreshedEvent 上没有事务代理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35878241/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com