You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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绑定该属性后再转成毫秒数设置给父类:

  1. 修改application.yml(调整配置key):
cache:
    service-available-event:
        duration: PT10M
  1. 更新配置类代码:
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类型:

  1. 保持application.yml不变:
cache:
    service-available-event:
        ttl: PT10M
  1. 更新配置类代码:
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,提问作者Антон Данилов

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 10:45:16