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}"
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
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 ;)
À 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;
}
}
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;
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.
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é.