web-dev-qa-db-fra.com

Spring boot 2 Converting Duration Java 8 application.properties

J'ai besoin de définir Durée valeur (spring.redis.timeout) par application.properties.

J'essayais d'utiliser un point défini dans documentation Spring Boot:

Spring Boot a un support dédié pour exprimer les durées. Si vous exposez un Java.time.Duration, les formats suivants sont disponibles dans les propriétés de l'application:

Une représentation longue régulière (en utilisant les millisecondes comme unité par défaut, sauf si un @DurationUnit a été spécifié) Le format standard ISO-8601 utilisé par Java.util.Duration Un format plus lisible où la valeur et l'unité sont couplées (par exemple 10s signifie 10 secondes)

Lorsque j'utilise spring.redis.timeout = 3s, l'application de démarrage Spring lance cette exception:

Impossible de convertir la valeur de type 'Java.lang.String' en type obligatoire 'Java.time.Duration': aucun éditeur ou stratégie de conversion correspondant trouvé

Quelle serait la meilleure façon de définir une valeur correcte pour une propriété Duration dans application.properties avec la dernière version Spring Boot 2?

7

Il est possible d'utiliser la notation @Value avec Spring Expression Language

@Value("#{T(Java.time.Duration).parse('${spring.redis.timeout}')}")
private Duration timeout;
5
Serge

La durée dans le moment (Spring-Boot 2.0.4.RELEASE), il n'est pas possible d'utiliser avec la notation @Value, mais il est possible d'utiliser avec @ConfigurationProperties

Pour Redis, vous avez RedisProperties et vous pouvez utiliser la configuration:

spring.redis.timeout=5s

Et:

@SpringBootApplication
public class DemoApplication {

  @Autowired
  RedisProperties redisProperties;

  public static void main(String[] args) {
    SpringApplication.run(DemoApplication.class, args);
  }

  @PostConstruct
  void init() {
    System.out.println(redisProperties.getTimeout());
  }
}

Il a imprimé (analyser en 5s):

PT5S

https://docs.Oracle.com/javase/8/docs/api//Java/time/Duration.html#parse-Java.lang.CharSequence-

4
Brother

Spring Boot tente de contraindre les propriétés d'application externe au type approprié lorsqu'elle se lie aux beans @ConfigurationProperties. Si vous avez besoin d'une conversion de type personnalisé, vous pouvez fournir un bean ConversionService (avec un bean nommé conversionService)

Voir: https://docs.spring.io/spring-boot/docs/2.0.4.RELEASE/reference/htmlsingle/#boot-features-external-config-conversion

Créez un bean ApplicationConversionService (il doit être nommé conversionService). Voici mon code testé avec Spring boot 2.0.4:

@Configuration
public class Conversion {

@Bean
public ApplicationConversionService conversionService()
{
    final ApplicationConversionService applicationConversionService = new ApplicationConversionService();
    return applicationConversionService;
}

Voici un exemple de projet utilisant cette approche:

https://github.com/cristianprofile/spring-data-redis-lettuce

3

Si votre version Spring-Boot ou ses dépendances ne mettent pas ApplicationConversionService en contexte (et Spring-Boot pas avant 2.1), vous pouvez l'exposer explicitement

@Bean
public ConversionService conversionService() {
    return ApplicationConversionService.getSharedInstance();
}

Il appelle Duration.parse, vous pouvez donc utiliser PT3S, PT1H30M, etc. dans les fichiers de propriétés.

0
Max