如何 spring 为 Joda Period 注入配置值
How to spring inject configuration value for Joda Period
如何使用 @Value 注释在我的 spring bean 中配置 Joda-Time Period 字段?
例如给定以下组件 class:
@Component
public class MyService {
@Value("${myapp.period:P1D}")
private Period periodField;
...
}
我想使用标准 ISO8601 格式在属性文件中定义句点。
我收到这个错误:
Caused by: java.lang.IllegalStateException: Cannot convert value of type [java.lang.String] to required type [org.joda.time.Period]: no matching editors or conversion strategy found
at org.springframework.beans.TypeConverterDelegate.convertIfNecessary(TypeConverterDelegate.java:302)
at org.springframework.beans.TypeConverterDelegate.convertIfNecessary(TypeConverterDelegate.java:125)
at org.springframework.beans.TypeConverterSupport.doConvert(TypeConverterSupport.java:61)
... 35 more
你能做的是register a Spring ConversionService
bean and implement a proper converter。
@Bean
public ConversionServiceFactoryBean conversionService() {
ConversionServiceFactoryBean conversionServiceFactoryBean = new ConversionServiceFactoryBean();
Set<Converter<?, ?>> myConverters = new HashSet<>();
myConverters.add(new StringToPeriodConverter());
conversionServiceFactoryBean.setConverters(myConverters);
return conversionServiceFactoryBean;
}
public class StringToPeriodConverter implements Converter<String, Period> {
@Override
public Period convert(String source) {
return Period.parse(source);
}
}
不需要任何 java 代码的简单解决方案是使用 Spring Expression Language (SpEL).
(我的示例使用 java.time.Duration 而不是 Joda 的东西,但我想你还是明白了。)
@Value("#{T(java.time.Duration).parse('${notifications.maxJobAge}')}")
private Duration maxJobAge;
另一个不优雅的选项是使用调用解析方法的字符串 setter。
@Value("${myapp.period:P1D}")
public void setPeriodField(String periodField)
{
if (isBlank(periodField))
this.periodField= null;
this.periodField= Duration.parse(periodField);
}
对于 joda-time:2.10.13 和 spring-boot:2.3.2.RELEASE 下一个示例(如所讨论的)有效:
@Value("${myapp.period:P1D}")
private Period periodField;
如果你使用java.time.Period,另外,工作了一个简单的句号属性格式(org.springframework.boot.convert.PeriodStyle):
@Value("${myapp.period:1d}")
private Period periodField;
如何使用 @Value 注释在我的 spring bean 中配置 Joda-Time Period 字段?
例如给定以下组件 class:
@Component
public class MyService {
@Value("${myapp.period:P1D}")
private Period periodField;
...
}
我想使用标准 ISO8601 格式在属性文件中定义句点。
我收到这个错误:
Caused by: java.lang.IllegalStateException: Cannot convert value of type [java.lang.String] to required type [org.joda.time.Period]: no matching editors or conversion strategy found
at org.springframework.beans.TypeConverterDelegate.convertIfNecessary(TypeConverterDelegate.java:302)
at org.springframework.beans.TypeConverterDelegate.convertIfNecessary(TypeConverterDelegate.java:125)
at org.springframework.beans.TypeConverterSupport.doConvert(TypeConverterSupport.java:61)
... 35 more
你能做的是register a Spring ConversionService
bean and implement a proper converter。
@Bean
public ConversionServiceFactoryBean conversionService() {
ConversionServiceFactoryBean conversionServiceFactoryBean = new ConversionServiceFactoryBean();
Set<Converter<?, ?>> myConverters = new HashSet<>();
myConverters.add(new StringToPeriodConverter());
conversionServiceFactoryBean.setConverters(myConverters);
return conversionServiceFactoryBean;
}
public class StringToPeriodConverter implements Converter<String, Period> {
@Override
public Period convert(String source) {
return Period.parse(source);
}
}
不需要任何 java 代码的简单解决方案是使用 Spring Expression Language (SpEL).
(我的示例使用 java.time.Duration 而不是 Joda 的东西,但我想你还是明白了。)
@Value("#{T(java.time.Duration).parse('${notifications.maxJobAge}')}")
private Duration maxJobAge;
另一个不优雅的选项是使用调用解析方法的字符串 setter。
@Value("${myapp.period:P1D}")
public void setPeriodField(String periodField)
{
if (isBlank(periodField))
this.periodField= null;
this.periodField= Duration.parse(periodField);
}
对于 joda-time:2.10.13 和 spring-boot:2.3.2.RELEASE 下一个示例(如所讨论的)有效:
@Value("${myapp.period:P1D}")
private Period periodField;
如果你使用java.time.Period,另外,工作了一个简单的句号属性格式(org.springframework.boot.convert.PeriodStyle):
@Value("${myapp.period:1d}")
private Period periodField;