diff --git a/src/main/java/org/springframework/data/redis/cache/RedisCacheManager.java b/src/main/java/org/springframework/data/redis/cache/RedisCacheManager.java index 788d19bc0..2e224e619 100644 --- a/src/main/java/org/springframework/data/redis/cache/RedisCacheManager.java +++ b/src/main/java/org/springframework/data/redis/cache/RedisCacheManager.java @@ -190,6 +190,16 @@ public class RedisCacheManager extends AbstractTransactionSupportingCacheManager RedisCacheConfiguration.defaultCacheConfig()); } + /** + * Entry point for builder style {@link RedisCacheManager} configuration. + * + * @return new {@link RedisCacheManagerBuilder}. + * @since 2.3 + */ + public static RedisCacheManagerBuilder builder() { + return new RedisCacheManagerBuilder(); + } + /** * Entry point for builder style {@link RedisCacheManager} configuration. * @@ -272,18 +282,20 @@ public class RedisCacheManager extends AbstractTransactionSupportingCacheManager * Configurator for creating {@link RedisCacheManager}. * * @author Christoph Strobl - * @author Mark Strobl + * @author Mark Paluch * @author Kezhu Wang * @since 2.0 */ public static class RedisCacheManagerBuilder { - private final RedisCacheWriter cacheWriter; + private @Nullable RedisCacheWriter cacheWriter; private RedisCacheConfiguration defaultCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig(); private final Map initialCaches = new LinkedHashMap<>(); private boolean enableTransactions; boolean allowInFlightCacheCreation = true; + private RedisCacheManagerBuilder() {} + private RedisCacheManagerBuilder(RedisCacheWriter cacheWriter) { this.cacheWriter = cacheWriter; } @@ -298,7 +310,7 @@ public class RedisCacheManager extends AbstractTransactionSupportingCacheManager Assert.notNull(connectionFactory, "ConnectionFactory must not be null!"); - return builder(new DefaultRedisCacheWriter(connectionFactory)); + return new RedisCacheManagerBuilder(new DefaultRedisCacheWriter(connectionFactory)); } /** @@ -329,6 +341,22 @@ public class RedisCacheManager extends AbstractTransactionSupportingCacheManager return this; } + /** + * Configure a {@link RedisCacheWriter}. + * + * @param cacheWriter must not be {@literal null}. + * @return this {@link RedisCacheManagerBuilder}. + * @since 2.3 + */ + public RedisCacheManagerBuilder cacheWriter(RedisCacheWriter cacheWriter) { + + Assert.notNull(cacheWriter, "CacheWriter must not be null!"); + + this.cacheWriter = cacheWriter; + + return this; + } + /** * Enable {@link RedisCache}s to synchronize cache put/evict operations with ongoing Spring-managed transactions. * @@ -435,6 +463,8 @@ public class RedisCacheManager extends AbstractTransactionSupportingCacheManager */ public RedisCacheManager build() { + Assert.notNull(cacheWriter, "CacheWriter must not be null!"); + RedisCacheManager cm = new RedisCacheManager(cacheWriter, defaultCacheConfiguration, initialCaches, allowInFlightCacheCreation); diff --git a/src/test/java/org/springframework/data/redis/cache/RedisCacheManagerUnitTests.java b/src/test/java/org/springframework/data/redis/cache/RedisCacheManagerUnitTests.java index 3b96ec2af..f8ea76e4b 100644 --- a/src/test/java/org/springframework/data/redis/cache/RedisCacheManagerUnitTests.java +++ b/src/test/java/org/springframework/data/redis/cache/RedisCacheManagerUnitTests.java @@ -16,6 +16,7 @@ package org.springframework.data.redis.cache; import static org.assertj.core.api.Assertions.*; +import static org.mockito.Mockito.*; import java.util.Collections; @@ -23,6 +24,7 @@ import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.junit.MockitoJUnitRunner; + import org.springframework.cache.Cache; import org.springframework.cache.transaction.TransactionAwareCacheDecorator; import org.springframework.data.redis.cache.RedisCacheManager.RedisCacheManagerBuilder; @@ -150,4 +152,19 @@ public class RedisCacheManagerUnitTests { assertThat(cmb.getCacheConfigurationFor("unknown")).isNotPresent(); } + + @Test // DATAREDIS-1118 + public void shouldConfigureRedisCacheWriter() { + + RedisCacheWriter writerMock = mock(RedisCacheWriter.class); + + RedisCacheManager cm = RedisCacheManager.builder(cacheWriter).cacheWriter(writerMock).build(); + + assertThat(cm).extracting("cacheWriter").isEqualTo(writerMock); + } + + @Test // DATAREDIS-1118 + public void builderShouldRequireCacheWriter() { + assertThatIllegalArgumentException().isThrownBy(() -> RedisCacheManager.builder().build()); + } }