【问题标题】:How to spring inject configuration value for Joda Period如何为 Joda Period 注入配置值
【发布时间】:2015-11-30 17:20:24
【问题描述】:

如何使用@Value 注解在我的 spring bean 中配置 Joda-Time Period 字段?

例如给定以下组件类:

@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

【问题讨论】:

  • 很可能需要注册一个转换器String->JodaPeriod
  • 谢谢。你知道这方面的任何例子吗?

标签: spring configuration jodatime period


【解决方案1】:

一个不需要任何java代码的简单解决方案是使用Spring Expression Language (SpEL)

(我的示例使用 java.time.Duration 而不是 Joda 的东西,但我想你还是明白了。)

    @Value("#{T(java.time.Duration).parse('${notifications.maxJobAge}')}")
    private Duration maxJobAge;

【讨论】:

  • 很好的答案!谢谢。
  • 如果我必须有一个默认值 null,这需要大量修改,因为 java.time.Duration::parse 会对 null 参数不满意。
【解决方案2】:

你可以做的是register a Spring ConversionService bean 和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);
    }
}

【讨论】:

  • 好东西。感谢您的帮助。
【解决方案3】:

另一个不优雅的选择是使用调用 parse 方法的 String setter。

@Value("${myapp.period:P1D}")
public void setPeriodField(String periodField)
{
    if (isBlank(periodField))
        this.periodField= null;
    this.periodField= Duration.parse(periodField);
}

【讨论】:

    【解决方案4】:

    对于 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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-01-31
      • 1970-01-01
      • 1970-01-01
      • 2021-01-30
      • 1970-01-01
      • 1970-01-01
      • 2015-08-12
      • 1970-01-01
      相关资源
      最近更新 更多