Skip to content

Commit 8bb1e3d

Browse files
committed
Add reproducer for transaction-aware cache error handling
1 parent c9087c2 commit 8bb1e3d

10 files changed

+145
-14
lines changed
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package com.example.demo;
2+
3+
import org.springframework.boot.autoconfigure.cache.RedisCacheManagerBuilderCustomizer;
4+
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
5+
import org.springframework.cache.annotation.CachingConfigurer;
6+
import org.springframework.cache.annotation.EnableCaching;
7+
import org.springframework.cache.interceptor.CacheErrorHandler;
8+
import org.springframework.cache.interceptor.LoggingCacheErrorHandler;
9+
import org.springframework.context.annotation.Bean;
10+
import org.springframework.context.annotation.Configuration;
11+
import org.springframework.data.redis.cache.RedisCacheManager;
12+
13+
@Configuration(proxyBeanMethods = false)
14+
@EnableCaching
15+
public class CachingConfiguration implements CachingConfigurer {
16+
17+
@Bean
18+
@ConditionalOnProperty(value = "makeRedisTransactionAware", matchIfMissing = true)
19+
public RedisCacheManagerBuilderCustomizer transactionAwareRedisCacheManagerBuilderCustomizer() {
20+
return RedisCacheManager.RedisCacheManagerBuilder::transactionAware;
21+
}
22+
23+
@Override
24+
public CacheErrorHandler errorHandler() {
25+
return new LoggingCacheErrorHandler();
26+
}
27+
}

src/main/java/com/example/demo/DemoApplication.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,10 @@
22

33
import org.springframework.boot.SpringApplication;
44
import org.springframework.boot.autoconfigure.SpringBootApplication;
5+
import org.springframework.transaction.annotation.EnableTransactionManagement;
56

67
@SpringBootApplication
8+
@EnableTransactionManagement
79
public class DemoApplication {
810

911
public static void main(String[] args) {
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package com.example.demo;
2+
3+
4+
import org.springframework.stereotype.Component;
5+
import org.springframework.transaction.annotation.Transactional;
6+
7+
@Component
8+
public class DemoController {
9+
private final DemoRepository repository;
10+
11+
public DemoController(DemoRepository repository) {
12+
this.repository = repository;
13+
}
14+
15+
@Transactional
16+
public String doSomething() {
17+
return repository.doSomething();
18+
}
19+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package com.example.demo;
2+
3+
import org.springframework.cache.annotation.Cacheable;
4+
import org.springframework.stereotype.Component;
5+
6+
@Component
7+
public class DemoRepository {
8+
@Cacheable("testCache")
9+
public String doSomething() {
10+
return "Value!";
11+
}
12+
}
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package com.example.demo;
2+
3+
import org.springframework.context.annotation.Bean;
4+
import org.springframework.context.annotation.Configuration;
5+
import org.springframework.transaction.PlatformTransactionManager;
6+
import org.springframework.transaction.TransactionDefinition;
7+
import org.springframework.transaction.TransactionException;
8+
import org.springframework.transaction.annotation.EnableTransactionManagement;
9+
import org.springframework.transaction.support.AbstractPlatformTransactionManager;
10+
import org.springframework.transaction.support.DefaultTransactionStatus;
11+
12+
@Configuration(proxyBeanMethods = false)
13+
@EnableTransactionManagement
14+
public class TransactionConfiguration {
15+
16+
@Bean
17+
public PlatformTransactionManager dummyTransactionManager() {
18+
return new AbstractPlatformTransactionManager() {
19+
@Override
20+
protected Object doGetTransaction() throws TransactionException {
21+
return new Object();
22+
}
23+
24+
@Override
25+
protected void doBegin(Object transaction, TransactionDefinition definition) throws TransactionException {
26+
// do nothing
27+
}
28+
29+
@Override
30+
protected void doCommit(DefaultTransactionStatus status) throws TransactionException {
31+
// do nothing
32+
}
33+
34+
@Override
35+
protected void doRollback(DefaultTransactionStatus status) throws TransactionException {
36+
// do nothing
37+
}
38+
};
39+
}
40+
}

src/main/resources/application.properties

Lines changed: 0 additions & 1 deletion
This file was deleted.

src/main/resources/application.yaml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
spring:
2+
cache:
3+
type: redis

src/test/java/com/example/demo/DemoApplicationTests.java

Lines changed: 0 additions & 13 deletions
This file was deleted.
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package com.example.demo;
2+
3+
import org.junit.jupiter.api.Test;
4+
import org.springframework.beans.factory.annotation.Autowired;
5+
import org.springframework.boot.test.context.SpringBootTest;
6+
7+
import static org.assertj.core.api.Assertions.assertThatCode;
8+
9+
@SpringBootTest
10+
class TestWithTransactionAwareness {
11+
12+
@Autowired
13+
private DemoController demoController;
14+
15+
@Test
16+
void doSomething() {
17+
assertThatCode(demoController::doSomething).doesNotThrowAnyException();
18+
}
19+
20+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package com.example.demo;
2+
3+
import org.junit.jupiter.api.Test;
4+
import org.springframework.beans.factory.annotation.Autowired;
5+
import org.springframework.boot.test.context.SpringBootTest;
6+
import org.springframework.test.context.TestPropertySource;
7+
8+
import static org.assertj.core.api.Assertions.assertThatCode;
9+
10+
@SpringBootTest
11+
@TestPropertySource(properties = "makeRedisTransactionAware=false")
12+
class TestWithoutTransactionAwareness {
13+
14+
@Autowired
15+
private DemoController demoController;
16+
17+
@Test
18+
void doSomething() {
19+
assertThatCode(demoController::doSomething).doesNotThrowAnyException();
20+
}
21+
22+
}

0 commit comments

Comments
 (0)