Spring Redis缓存配置:如何在application.yml中将TTL改为PT格式字符串?
Spring Redis缓存TTL配置:使用ISO-8601格式(PT10M)的解决方案
可以直接在application.yml中使用PT10M这类ISO-8601格式的字符串配置TTL,问题出在你的配置类绑定逻辑上,以下是具体修复方案:
问题根源
父类CacheConfig的ttl属性是long类型(存储毫秒数),你定义的setTTL(Duration)方法并没有被Spring Boot的配置绑定机制优先识别,框架仍会尝试直接将PT10M字符串转换为long类型,因此抛出NumberFormatException。
修复方案
方案一:新增独立的Duration属性(推荐)
修改配置类,新增一个Duration类型的属性,让Spring绑定该属性后再转成毫秒数设置给父类:
- 修改
application.yml(调整配置key):
cache: service-available-event: duration: PT10M
- 更新配置类代码:
import org.springframework.cache.CacheManager; import java.time.Duration; @Configuration @EnableCaching public class RedisConfiguration { @Bean @ConfigurationProperties("cache.service-available-event") public CustomCacheConfig serviceAvailableEventCacheConfig() { return new CustomCacheConfig(); } public class CustomCacheConfig extends CacheConfig { private Duration duration; public void setDuration(Duration duration) { this.duration = duration; // 转成毫秒数设置给父类的TTL super.setTTL(duration.toMillis()); } public Duration getDuration() { return duration; } } }
方案二:保留原配置key(ttl),覆盖属性绑定
如果不想修改application.yml的配置key,可通过覆盖属性的方式让Spring优先绑定Duration类型:
- 保持
application.yml不变:
cache: service-available-event: ttl: PT10M
- 更新配置类代码:
import org.springframework.cache.CacheManager; import java.time.Duration; @Configuration @EnableCaching public class RedisConfiguration { @Bean @ConfigurationProperties("cache.service-available-event") public CustomCacheConfig serviceAvailableEventCacheConfig() { return new CustomCacheConfig(); } public class CustomCacheConfig extends CacheConfig { private Duration ttl; // 保留父类的long类型setter,但不依赖它 @Override public void setTTL(long ttl) { super.setTTL(ttl); } // 定义Duration类型的setter,Spring会优先匹配该方法绑定配置 public void setTtl(Duration ttl) { this.ttl = ttl; super.setTTL(ttl.toMillis()); } public Duration getTtl() { return ttl; } } }
原理说明
Spring Boot原生支持将ISO-8601格式的字符串(如PT10M)自动转换为java.time.Duration类型,只要配置类中存在对应的Duration属性和标准setter方法,框架就能完成正确绑定,再通过手动转换为毫秒数即可适配父类的long类型TTL属性。
内容的提问来源于stack exchange,提问作者Антон Данилов
相关产品推荐
相关产品推荐

