From 8b90fe099e643358e6cc687836ab43992caf57ff Mon Sep 17 00:00:00 2001 From: root Date: Fri, 26 Jun 2026 09:58:00 +0800 Subject: [PATCH] =?UTF-8?q?fix(cache):=20=E7=BC=BA=20StringRedisTemplate?= =?UTF-8?q?=20Bean=20=E6=97=B6=E8=87=AA=E5=8A=A8=E8=A3=85=E9=85=8D?= =?UTF-8?q?=E4=BC=98=E9=9B=85=E9=80=80=E5=9C=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 原仅 @ConditionalOnClass(类在 classpath 恒真),StringRedisTemplate Bean 缺失 (多 ConnectionFactory 致 @ConditionalOnSingleCandidate 不满足,或 exclude RedisAutoConfiguration)时会因构造参数缺依赖而启动失败。加 @ConditionalOnBean(StringRedisTemplate),配合既有 @AutoConfigureAfter(RedisAutoConfiguration) 在 Redis 装配后求值,缺 Bean 时整类 back off 而非报错。仅改 cache,不动 stream(接受两者风格暂不一致)。 Co-Authored-By: Claude Opus 4.8 (1M context) --- .../cache/autoconfig/RedisCacheAutoConfiguration.java | 2 ++ .../autoconfig/RedisCacheAutoConfigurationTest.java | 11 +++++++++++ 2 files changed, 13 insertions(+) diff --git a/src/main/java/com/njcn/middle/cache/autoconfig/RedisCacheAutoConfiguration.java b/src/main/java/com/njcn/middle/cache/autoconfig/RedisCacheAutoConfiguration.java index e456ecb..58a957f 100644 --- a/src/main/java/com/njcn/middle/cache/autoconfig/RedisCacheAutoConfiguration.java +++ b/src/main/java/com/njcn/middle/cache/autoconfig/RedisCacheAutoConfiguration.java @@ -4,6 +4,7 @@ import com.njcn.middle.cache.support.CacheKeyBuilder; import com.njcn.middle.cache.support.CacheValueCodec; import com.njcn.middle.cache.template.RedisCacheEnhanceTemplate; import org.springframework.boot.autoconfigure.AutoConfigureAfter; +import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration; @@ -18,6 +19,7 @@ import org.springframework.data.redis.core.StringRedisTemplate; */ @Configuration @ConditionalOnClass(StringRedisTemplate.class) +@ConditionalOnBean(StringRedisTemplate.class) @AutoConfigureAfter(RedisAutoConfiguration.class) @EnableConfigurationProperties(RedisCacheProperties.class) public class RedisCacheAutoConfiguration { diff --git a/src/test/java/com/njcn/middle/cache/autoconfig/RedisCacheAutoConfigurationTest.java b/src/test/java/com/njcn/middle/cache/autoconfig/RedisCacheAutoConfigurationTest.java index 275d03d..57fe23d 100644 --- a/src/test/java/com/njcn/middle/cache/autoconfig/RedisCacheAutoConfigurationTest.java +++ b/src/test/java/com/njcn/middle/cache/autoconfig/RedisCacheAutoConfigurationTest.java @@ -40,6 +40,17 @@ class RedisCacheAutoConfigurationTest { }); } + @Test + void backsOffWhenNoStringRedisTemplateBean() { + // 不装配 RedisAutoConfiguration,上下文内无 StringRedisTemplate Bean: + // 应整类 back off 优雅退场,而非因缺依赖启动失败。 + new ApplicationContextRunner() + .withConfiguration(AutoConfigurations.of(RedisCacheAutoConfiguration.class)) + .run(ctx -> assertThat(ctx) + .hasNotFailed() + .doesNotHaveBean(RedisCacheEnhanceTemplate.class)); + } + @Configuration static class CustomConfig { @Bean