2015-11-30 1 views
5

Comment puis-je utiliser l'annotation @Value pour configurer un champ Joda-Time Période dans mon haricot de printemps?Comment faire pour injecter la valeur de configuration pour Joda Période

E.g. Étant donné la classe de composant suivante:

@Component 
public class MyService { 

    @Value("${myapp.period:P1D}") 
    private Period periodField; 
... 
} 

Je souhaite utiliser le format ISO8601 standard pour définir la période dans un fichier de propriétés.

Je reçois cette erreur:

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

Il est probable que vous deviez enregistrer un convertisseur String-> JodaPeriod – Ralph

+0

Merci. Connaissez-vous des exemples pour cela? – Pat

Répondre

4

Qu'est-ce que vous pouvez faire est register a Spring ConversionService haricots et 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

Des trucs géniaux. Merci de votre aide. – Pat

6

Une solution simple qui ne nécessite aucun code Java est d'utiliser Spring Expression Language (SpEL).

(Mon exemple utilise java.time.Duration et non des choses Joda mais je pense que vous obtenez de toute façon.)

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

Bonne réponse! Je vous remercie. –

1

Un autre, pas élégant, option, est d'utiliser un poseur de cordes qui invoque l'analyse syntaxique méthode.

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