春季自定义平台事务管理器

时间:2015-02-17 14:20:28

标签: spring transactions

我试图在Spring启动应用程序中实现自定义事务缓存。我已经创建了自己的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());
    }
}

不使用wicket应用程序主类(忽略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数据JPA 1.7.2,Hibernate 4.3.7,Apache Tomcat 8.0.15,Wicket 6.17.0

1 个答案:

答案 0 :(得分:2)

我发现了一些新的事实:

  • 当我从CacheTransactionConfiguration上的@EnableTransactionManagement中删除AdviceMode.ASPECTJ时,事务开始起作用,但事务的传播被忽略 - 从一个@CacheTransactional方法到另一个@CacheTransactional方法的嵌套调用总是创建新的事务。 JUnit测试和实际应用程序中的行为相同。

  • 当AdviceMode.ASPECTJ在CacheTransactionConfiguration上设置时,但我从junit test中删除了@CacheTransactional注释,事务也在juint中停止工作(在测试体中是一个@CacheTransaction方法调用,所以应该创建一个事务) 。

  • 应用程序日志包含此条目: o.s.c.a.ConfigurationClassBeanDefinitionReader isOverriddenByExistingDefinition:290 - 跳过[BeanMethod:name = cacheTransactionManager,declaringClass = x.y.z.CacheTransactionConfiguration]的bean定义:bean'cacheTransactionManager'的定义已经存在。此顶级bean定义被视为覆盖。

所以我可以让它工作,但没有传播...