web-dev-qa-db-fra.com

Configuration Spring Boot yaml pour une liste de chaînes

J'essaie de charger un tableau de chaînes à partir du fichier application.yml. C'est la config:

ignore:
    filenames:
        - .DS_Store
        - .hg

C'est la classe:

@Value("${ignore.filenames}")
private List<String> igonoredFileNames = new ArrayList<>();

Il existe d'autres configurations de la même classe qui se chargent très bien. Il n'y a pas d'onglets dans mon fichier yaml. J'ai toujours l'exception suivante:

Caused by: Java.lang.IllegalArgumentException: Could not resolve placeholder 'ignore.filenames' in string value "${ignore.filenames}"
108
Bahadır Yağan

Mon suppose que le @Value ne peut pas gérer les types "complexes". Vous pouvez aller avec une classe d'access comme ceci:

@Component
@ConfigurationProperties('ignore')
class IgnoreSettings {
    List<String> filenames
}

Veuillez noter: Ce code est Groovy - et non Java - pour garder l'exemple court! Voir les commentaires pour des conseils sur l'adoption.

Voir l'exemple complet https://github.com/christoph-frick/so-springboot-yaml-string-list

58
cfrick

utilisez des valeurs séparées par des virgules dans application.yml

ignoreFilenames: .DS_Store, .hg

Code Java pour l'accès

@Value("${ignoreFilenames}")    
String[] ignoreFilenames

Ça fonctionne ;)

89
Ahmet Vehbi Olgaç

À partir des documents de démarrage du printemps https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html

Les listes YAML sont représentées sous forme de clés de propriété avec des dereferencers [index], par exemple ce YAML:

my:
   servers:
       - dev.bar.com
       - foo.bar.com

Serait transformé en ces propriétés:

my.servers[0]=dev.bar.com
my.servers[1]=foo.bar.com

Pour vous lier à des propriétés comme celle qui utilise les utilitaires Spring DataBinder (ce que fait @ConfigurationProperties), vous devez avoir une propriété dans le bean cible de type Java.util.List et vous devez soit spécifier un initialisateur, soit initialiser. avec une valeur modifiable, par exemple cela va se lier aux propriétés ci-dessus. Voici à quoi ressemblerait le code de la question.

@ConfigurationProperties(prefix="ignore")
public class Filenames {

    private List<String> ignoredFilenames = new ArrayList<String>();

    public List<String> getFilenames() {
        return this.ignoredFilenames;
    }
}
27
dskow

En plus de réponse d'Ahmet , vous pouvez ajouter des sauts de ligne à la chaîne séparée par des virgules en utilisant le symbole >.

application.yml :

ignoreFilenames: >
  .DS_Store, 
  .hg

code Java :

@Value("${ignoreFilenames}")    
String[] ignoreFilenames;
18
Sasha Shpota

Réponse d'Ahmet explique comment affecter les valeurs séparées par des virgules au tableau String.

Pour utiliser la configuration ci-dessus dans différentes classes, vous devrez peut-être créer des getters/setters pour cela. Mais si vous souhaitez charger cette configuration une fois et continuer à l'utiliser comme bean avec une annotation Autowired, voici comment j'ai accompli:

Dans ConfigProvider.Java

@Bean (name = "ignoreFileNames")
@ConfigurationProperties ( prefix = "ignore.filenames" )
public List<String> ignoreFileNames(){
    return new ArrayList<String>();
}

En dehors des cours:

@Autowired
@Qualifier("ignoreFileNames")
private List<String> ignoreFileNames;

vous pouvez utiliser la même liste partout ailleurs par autowiring.

2
Deepak

Dans mon cas, il s'agissait d'un problème de syntaxe dans le fichier .yml. J'avais:

@Value("${spring.kafka.bootstrap-servers}")
public List<String> BOOTSTRAP_SERVERS_LIST;

et la liste dans mon fichier .yml:

bootstrap-servers:
  - s1.company.com:9092
  - s2.company.com:9092
  - s3.company.com:9092

ne lisait pas dans le champ @ Valeur annotée. Quand j'ai changé la syntaxe dans le fichier .yml à:

bootstrap-servers >
  s1.company.com:9092
  s2.company.com:9092
  s3.company.com:9092

cela a bien fonctionné.

0
Matt Campbell