【发布时间】:2015-04-18 06:26:10
【问题描述】:
我正在尝试在 Spring Boot 应用程序中实现自定义事务缓存。我创建了自己的 AbstractPlatformTransactionManager 实现和一些单元测试,它们显示事务按预期工作。然而,真正的应用程序忽略了我的事务管理器——它的方法永远不会被调用。我做错了什么?谢谢。
事务管理器实现:
@Component
public class CacheTransactionManager extends AbstractPlatformTransactionManager{
@Override
protected Object doGetTransaction() throws TransactionException {
...
}
...
}
缓存事务配置:
@Configuration
@EnableTransactionManagement(mode = AdviceMode.ASPECTJ)
public class CacheTransactionConfiguration {
@Bean(name = "cacheTransactionManager")
public PlatformTransactionManager cacheTransactionManager() {
return new CacheTransactionManager();
}
}
自定义事务注释(我也试过没有这个,但没有区别):
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Transactional(value = "cacheTransactionManager", rollbackFor = Exception.class)
public @interface CacheTransactional {
}
缓存服务:
@Component
public class CacheService {
@CacheTransactional
public void add(Object o){
...
}
}
工作 JUnit 测试:
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = TestApplication.class)
@Configuration
@EntityScan(...)
@IntegrationTest
@TransactionConfiguration(defaultRollback = false)
public class CacheTransactionManagerTest {
@Autowired
private CacheService cacheService;
@Test
@CacheTransactional
public void transactionTest(){
cacheService.add(new Object());
}
}
不工作的检票口应用程序主类(忽略 cacheTransactionManager):
@Configuration("MyApplication")
@EnableAutoConfiguration
@EntityScan(...)
@EnableJpaRepositories(...)
@EnableTransactionManagement(mode = AdviceMode.ASPECTJ)
@ComponentScan(...)
@ImportResource({...})
public class MyApplication extends AuthenticatedWebApplication {
...
}
我的环境:Java 8、Spring Boot 1.2.1、Spring 4.1.4、Spring data JPA 1.7.2、Hibernate 4.3.7、Apache Tomcat 8.0.15、Wicket 6.17.0
【问题讨论】:
-
应该如何准确处理
@CacheTransactional?你能解释一下你想要做什么吗? -
我想在执行 @CacheTransactional 方法之前实现一个事务创建(调用事务管理器中的方法 doGetTransaction 和 doBegin),当方法成功完成时,调用 doCommit ,否则(以防万一异常)doRollback 被调用。这在 junit 测试中有效,但在应用程序中无效。
标签: spring transactions