我需要通过application.properties定义Duration值(spring.redis.timeout)。
我试图使用Spring启动文档中定义的一个点:
Spring Boot专门支持表达持续时间。如果公开java.time.Duration
属性,则可以使用应用程序属性中的以下格式:
常规长表示(使用毫秒作为默认单位,除非指定了@DurationUnit
)java.util.Duration
使用的标准ISO-8601格式更可读的格式,其中值和单位耦合(例如10s表示10秒)
当我使用spring.redis.timeout = 3s时Spring启动应用程序抛出此异常:
无法将'java.lang.String'类型的值转换为必需类型'java.time.Duration':找不到匹配的编辑器或转换策略
哪个是在application.properties中使用最后一个Spring boot 2版本为Duration属性设置正确值的最佳方法?
当前的持续时间(Spring-Boot 2.0.4.RELEASE)它不可能与@Value表示法一起使用,但可以与@ConfigurationProperties一起使用
对于Redis,您有RedisProperties,您可以使用配置:
spring.redis.timeout=5s
和:
@SpringBootApplication
public class DemoApplication {
@Autowired
RedisProperties redisProperties;
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
@PostConstruct
void init() {
System.out.println(redisProperties.getTimeout());
}
}
它打印(解析为5s):
PT5S
https://docs.oracle.com/javase/8/docs/api//java/time/Duration.html#parse-java.lang.CharSequence-
当Spring绑定到@ConfigurationProperties bean时,Spring Boot会尝试将外部应用程序属性强制转换为正确的类型。如果需要自定义类型转换,可以提供ConversionService bean(使用名为conversionService的bean)
创建新的ApplicationConversionService bean(必须命名为conversionService)。在这里,我是使用Spring boot 2.0.4测试的代码:
@Configuration
public class Conversion {
@Bean
public ApplicationConversionService conversionService()
{
final ApplicationConversionService applicationConversionService = new ApplicationConversionService();
return applicationConversionService;
}
这是一个使用这种方法的示例项目:
https://github.com/cristianprofile/spring-data-redis-lettuce
可以在Spring Expression Language中使用@Value表示法
@Value("#{T(java.time.Duration).parse('${spring.redis.timeout}')}")
private Duration timeout;