web-dev-qa-db-fra.com

Spring Boot: Plusieurs ConfigurationProperties similaires avec des préfixes différents

J'utilise Spring Boot et dispose de deux services très similaires que j'aimerais configurer dans mon application.yml.

La configuration ressemble à peu près à ceci:

serviceA.url=abc.com
serviceA.port=80

serviceB.url=def.com
serviceB.port=8080

Est-il possible de créer une classe annotée avec @ConfigurationProperties et de définir le préfixe au point d'injection?

par exemple.

@Component
@ConfigurationProperties
public class ServiceProperties {
   private String url;
   private String port;

   // Getters & Setters
}

puis dans les services eux-mêmes:

public class ServiceA {

   @Autowired
   @SomeFancyAnnotationToSetPrefix(prefix="serviceA")
   private ServiceProperties serviceAProperties;

   // ....
}

Malheureusement, je n'ai trouvé aucun élément dans la documentation concernant une telle fonctionnalité ... Merci beaucoup pour votre aide!

4
nioe

J'ai réalisé presque la même chose que celle que vous essayez ... d'abord. Enregistrez d'abord les propriétés de chaque haricot.

@Bean
@ConfigurationProperties(prefix = "serviceA")
public ServiceProperties  serviceAProperties() {
    return new ServiceProperties ();
}

@Bean
@ConfigurationProperties(prefix = "serviceB")
public ServiceProperties  serviceBProperties() {
    return new ServiceProperties ();
}

et au service (ou quelque part où utilisera des propriétés), mettez un @Qualifier et spécifiez quelle propriété sera automatiquement câblée.

public class ServiceA {
    @Autowired
    @Qualifier("serviceAProperties")
    private ServiceProperties serviceAProperties;

}
4
Javvano

L'exemple Javvanos a parfaitement fonctionné, à l'exception de la validation JavaBean. 

J'ai eu une annotation @NotNull sur l'une des propriétés:

public class ServiceProperties {
   @NotNull
   private String url;
   private String port;

   // Getters & Setters

}

En conséquence, le démarrage de l'application a échoué avec le message d'erreur suivant:

***************************
APPLICATION FAILED TO START
***************************

Description:

Binding to target ch.sbb.hop.commons.infrastructure.hadoop.spark.SparkJobDeployerConfig@730d2164 failed:

    Property: url
    Value: null
    Reason: may not be null


Action:

Update your application's configuration

Après avoir supprimé l'annotation, l'application démarre avec la liaison de propriété correcte. En conclusion, je pense qu’il ya un problème avec la validation JavaBean qui n’obtient pas l’instance correctement initialisée, peut-être en raison de l’absence de proxy sur les méthodes de configuration.

0
Qnob