【问题标题】:@Caching method called from spring boot test [annotated with @Transactional] not working从 Spring Boot 测试中调用的 @Caching 方法 [@Transactional 注释] 不起作用
【发布时间】:2019-07-14 10:02:29
【问题描述】:

我正在使用redis缓存和spring boot注解[@Cacheable和@CahePut], 我做了RedisManager transactionAware,它将使用外部事务[缓存层的被调用者]

@Bean
public RedisCacheManager cacheManager() {
    RedisCacheManager rcm = 
    RedisCacheManager.builder(redisConnectionFactory())
            .cacheDefaults(cacheConfiguration())
            .transactionAware()
            .build();
    return rcm;
}

在进行如下测试时,我使用的是嵌入式 redis-:

@RunWith(SpringRunner.class)
@SpringBootTest
@AutoConfigureTestDatabase
@Transactional
public class RoleServiceImplTest extends TestingProfile {

@Before
public void setup() throws Exception {
    //setup server and services

    redisServer = new RedisServer(redisPort);
    redisServer.start();
}
@Test
    public void getUsersForRoleForTemplateRole() {
    // call to caching layer methods directly annotated with @Cachable
}

... 两次[有和没有@Transactional] spring 无一例外地调用cache.put(key,result),但它只在没有@Transactional 的情况下保留值。

在互联网上找不到太多信息,感谢提前提供任何帮助。

【问题讨论】:

    标签: java spring spring-boot caching redis


    【解决方案1】:

    简而言之,只需将 @CommitRollback(false) 注释放在您的类或测试方法上。

    Spring 默认回滚测试方法之后的每个事务。

    https://docs.spring.io/spring/docs/current/spring-framework-reference/testing.html#testcontext-tx

    在TestContext 框架中,事务由默认配置的TransactionalTestExecutionListener 管理,即使您没有在测试类上显式声明@TestExecutionListeners。但是,要启用对事务的支持,您必须在 ApplicationContext 中配置一个 PlatformTransactionManager bean,该 bean 加载有 @ContextConfiguration 语义(稍后提供更多详细信息)。此外,您必须在测试的类或方法级别声明 Spring 的 @Transactional 注释。

    https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/test/context/transaction/TransactionalTestExecutionListener.html

    声明性回滚和提交行为

    默认情况下,测试完成后测试事务会自动回滚;但是,事务提交和回滚行为可以通过 @Commit@Rollback 注释在类级别和方法级别以声明方式进行配置。

    【讨论】:

    猜你喜欢
    • 2019-06-15
    • 2020-12-11
    • 1970-01-01
    • 2020-06-04
    • 2019-07-12
    • 2019-12-07
    • 2018-02-23
    • 1970-01-01
    相关资源
    最近更新 更多