Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
spring中的定制平台事务管理器_Spring_Transactions - Fatal编程技术网

spring中的定制平台事务管理器

spring中的定制平台事务管理器,spring,transactions,Spring,Transactions,我试图在spring引导应用程序中实现自定义事务缓存。我已经创建了自己的AbstractPlatformTransactionManager实现和一些单元测试,它们显示事务按预期工作。然而,真正的应用程序忽略了我的事务管理器——它的方法永远不会被调用。我做错了什么?多谢各位 事务管理器实现: @Component public class CacheTransactionManager extends AbstractPlatformTransactionManager{ @Overri

我试图在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();
    }  
}

自定义事务注释(我也尝试过,但没有区别):

缓存服务:

@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):


我的环境: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我发现了一些新的事实:

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

  • 当AdviceMode.ASPECTJ在CacheTransactionConfiguration设置上,但我从junit测试中删除了@CacheTransactionAnnotation时,事务也在junit中停止工作(在测试体中调用了@CacheTransactionMethod,所以应该创建了一个事务)

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


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

对于传播,您需要告诉Spring的@Transactional应用什么传播模式。您可以定义几个tx注释,每个注释继承自@Transactional,但传播模式不同。

那么应该如何准确处理
@CacheTransactional
?你能再解释一下你想做什么吗?我想在@CacheTransactional方法的执行之前创建一个事务(从事务管理器调用doGetTransaction和doBegin方法),当该方法成功完成时,调用doCommit,否则(在异常情况下)这在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());
    }
}
@Configuration("MyApplication")
@EnableAutoConfiguration
@EntityScan(...)
@EnableJpaRepositories(...)
@EnableTransactionManagement(mode = AdviceMode.ASPECTJ)
@ComponentScan(...)
@ImportResource({...})
public class MyApplication extends AuthenticatedWebApplication {
...
}