2015-11-30 3 views
5

Wie kann ich die @Value Anmerkung verwenden, um ein Joda-Time Zeitraum Feld in meinem Frühling Bohne zu konfigurieren?Wie inject Konfigurationswert für Joda Zeitraum bis zum Frühjahr

z. Angesichts der folgenden Komponente Klasse:

Ich möchte Standard-ISO8601-Format verwenden, um den Zeitraum in einer Eigenschaftendatei zu definieren.

ich diesen Fehler:

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

Es ist wahrscheinlich, dass Sie einen Konverter String-> JodaPeriod – Ralph

+0

Vielen Dank registrieren müssen. Kennen Sie Beispiele dafür? – Pat

Antwort

4

Was können Sie tun, ist register a Spring ConversionService Bohne und 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

Großartiges Zeug. Danke für Ihre Hilfe. – Pat

6

Eine einfache Lösung, die keine Java-Code erfordert, ist Spring Expression Language (SpEL) zu verwenden.

(Mein Beispiel verwendet java.time.Duration und nicht Sachen Joda aber ich denke, Sie es trotzdem zu bekommen.)

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

Große Antwort! Vielen Dank. –

1

Eine weitere, nicht elegant, Option ist einen String-Setter zu verwenden, das das Parsing ruft Methode.

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