7
votes

spring liste de référence application.yml d'une autre propriété

J'ai le fichier de propriétés application-dev.yml avec le contenu:

some.value: ${config.some.value}

et un autre application-staging.yml avec le contenu:

spring.profiles: staging
config.some.value:
- ELEMENT1
- ELEMENT2
- ELEMENT3

donc je ne connais pas la taille de la liste. Lorsque je référence cette liste dans application.yml principale comme ceci:

spring.profiles: dev
config.some.value:
- ELEMENT1
- ELEMENT2

J'obtiens Impossible de convertir la valeur de propriété de type 'java. lang.String 'au type requis' java.util.List 'pour la propriété' value '. Comment le référencer correctement?


1 commentaires

alors qu'est-ce que tu veux faire exactement? vous voulez inclure staging et dev dans default application.yml?


6 Réponses :


0
votes
  @Autowired
   private YAMLConfig myConfig;


 private List<String> SomeValues= myConfig.SomeValues();

1 commentaires

Je ne peux pas changer de code. Je dois le faire uniquement dans les fichiers .yml.



0
votes

Vous pouvez créer votre propre classe de configuration qui définit la valeur de cette propriété comme vous le souhaitez.

S'il vous plaît, jetez un œil à cet exemple:

@ConfigurationProperties dans Spring Boot


0 commentaires

0
votes

Lors de l'utilisation de tableaux de chaînes, le premier et le seul élément PEUT être joint par des virgules - le résultat final est le même qu'une liste. Cela signifie que vous pouvez définir votre variable comme ceci:

config.some.value: ELEMENT1, ELEMENT2, ELEMENT3

ensuite, dans la section de votre profil, vous pouvez référencer la valeur de configuration comme s'il s'agissait d'une chaîne normale:

someValues: $ {config.some.value}


0 commentaires

0
votes

(J'ai peur,) Vous auriez à le référencer comme ça:

application.yaml:

some.value:
  -${config.some.value[0]}
  -${config.some.value[1]}
  -${config.some.value[2]}

... et je prévois des problèmes, quand il y a no $ {config.some.value [2]} (les tailles de liste sont incohérentes .. -> approche de la solution: essayez de "factice" / "noop").

Réf. :


0 commentaires

8
votes

Une façon serait d'utiliser des listes séparées par des virgules dans vos profils:

  • application-dev.yml
YAML lists are represented as comma-separated values (useful for simple String values) and also as property keys with [index] dereferencers, for example this YAML:
servers:
    - dev.bar.com
    - foo.bar.com
Would be transformed into these properties:
servers=dev.bar.com,foo.bar.com
servers[0]=dev.bar.com
servers[1]=foo.bar.com
  • application-staging.yml
some.value: ${config.some.value}

Ensuite, vous devriez pouvoir y accéder dans application.yml

spring.profiles: staging
config.some.value: ELEMENT1,ELEMENT2,ELEMENT3

Cette solution ne nécessite pas de liste de connaissances taille à l'avance.

Explication

La raison pour laquelle cela fonctionne est décrite ici . Plus précisément:

spring.profiles: dev
config.some.value: ELEMENT1,ELEMENT2

En particulier, cela signifie que si vous spécifiez une liste de chaînes séparées par des virgules dans application.yml et définissez List comme valeur dans @ConfigurationProperties , le classeur de propriétés de configuration de ressort convertira cette liste de chaînes séparées par des virgules en List .


0 commentaires

0
votes

C'est la meilleure façon de créer un fichier .yml avec plusieurs valeurs:

@Value("${spring.config.some.values}")    
private String[] values;

Lorsque nous utilisons des fichiers .yml, nous vous recommandons de séparer chaque mot. Pour lire les valeurs, utilisez:

spring:
  profiles: dev
  config:
    some:
      values: ELEMENT1,ELEMENT2

J'espère que cela vous aidera.


0 commentaires