2015-11-30 6 views
5

@Valueアノテーションを使用してJoda-Timeを設定するにはどうすればよいですか?期間のフィールドをSpring Beanで使用しますか?Joda期間の設定値をスプリング注入する方法

など。以下のコンポーネントクラスを考える:

@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 
+0

変換器を登録する必要がある可能性があります。String-> JodaPeriod – Ralph

+0

ありがとうございました。あなたはこれの例を知っていますか? – Pat

答えて

4

何ができるかはregister a Spring ConversionService豆と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); 
    } 
} 
+0

すばらしいもの。ご協力いただきありがとうございます。 – Pat

6

javaコードを必要としない単純な解決策は、Spring Expression Language (SpEL)を使用することです。

(私の例では、java.time.Durationなくジョダのものを使用していますが、私はとにかくそれを得ると思います。)

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

偉大な答え!ありがとうございました。 –

1

もう、ないエレガント、オプションでは、解析を呼び出す文字列のセッターを使用することです方法。

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