Je veux avoir une liste de valeurs dans un fichier .properties, c'est-à-dire:
my.list.of.strings=ABC,CDE,EFG
Et pour le charger directement dans ma classe, c'est à dire:
@Value("${my.list.of.strings}")
private List<String> myList;
Si je comprends bien, une alternative consiste à l'avoir dans le fichier de configuration de printemps et à le charger comme référence de bean (corrigez-moi si je me trompe), c'est-à-dire
<bean name="list">
<list>
<value>ABC</value>
<value>CDE</value>
<value>EFG</value>
</list>
</bean>
Mais existe-t-il un moyen de le faire? en utilisant un fichier .properties? ps: je voudrais le faire sans code personnalisé si possible.
java
spring
spring-properties
JackDev
la source
la source
org.springframework.expression.spel.SpelEvaluationException
exception et nonjavax.el.ELException
. Votre objection est-elle créée par Spring?my.list.of.strings=
? Je m'attendrais à ce qu'une telle fonctionnalité redéfinisse la liste vide où ici ce sera un élément (chaîne vide), n'est-ce pas?item1, item2, item3
peuvent vous donner un résultat auquel vous ne vous attendez pas vraiment (indice: espaces).@Value("#{'${my.list.of.strings}'.split(',\\s*')}")
Depuis Spring 3.0, vous pouvez ajouter une ligne comme
à ton
applicationContext.xml
(ou où vous configurez les choses). Comme le souligne Dmitry Chornyi dans un commentaire, la configuration basée sur Java ressemble à:Cela active le nouveau service de configuration qui prend en charge la conversion
String
enCollection
types. Si vous n'activez pas ce service de configuration, Spring se rabat sur ses éditeurs de propriétés hérités en tant que services de configuration, qui ne prennent pas en charge ce type de conversion.La conversion en collections d'autres types fonctionne également:
fonctionnera avec une ligne comme
Aucun problème avec les espaces blancs là-bas, le
ConversionServiceFactoryBean
prend en charge.Voir http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/#core-convert-Spring-config
la source
split()
dans chaque expression, il gère également correctement une liste vide au lieu de vous donner[null]
Si vous lisez ceci et que vous utilisez Spring Boot , vous avez 1 option de plus pour cette fonctionnalité
Habituellement, la liste séparée par des virgules est très maladroite pour un cas d'utilisation réel (et parfois même impossible, si vous souhaitez utiliser des virgules dans votre configuration):
Avec Spring Boot , vous pouvez l'écrire comme ceci (l'index commence à 0):
Et utilisez-le comme ceci:
la source
En spécifiant le
my.list.of.strings=ABC,CDE,EFG
fichier in .properties et en utilisant@Value("${my.list.of.strings}")
private String[] myString;
Vous pouvez obtenir les tableaux de chaînes. Et en utilisant
CollectionUtils.addAll(myList, myString)
, vous pouvez obtenir la liste des chaînes.la source
Avez-vous envisagé de
@Autowired
construire un constructeur ou un poseur et de vousString.split()
plonger dans le corps?J'ai tendance à préférer effectuer mon câblage automatique de l'une de ces façons pour améliorer la testabilité de mon code.
la source
Si vous utilisez Spring Boot 2, il fonctionne tel quel, sans configuration supplémentaire.
la source
private List<String> myList;
Toutes les réponses ci-dessus sont correctes. Mais vous pouvez y parvenir en une seule ligne. Veuillez essayer la déclaration suivante et vous obtiendrez toutes les valeurs séparées par des virgules dans une liste de chaînes.
Et vous devez également avoir la ligne suivante définie dans votre configuration xml.
remplacez simplement le chemin et le nom de fichier de votre fichier de propriétés. Et vous êtes prêt à partir. :)
J'espère que cela vous aidera. À votre santé.
la source
@Value("#{T(java.util.Arrays).asList('${my.list.of.strings}')}")
Si vous utilisez la dernière version du framework Spring (Spring 3.1+ je crois), vous n'avez pas besoin de ces éléments de séparation de chaînes dans SpringEL,
Ajoutez simplement PropertySourcesPlaceholderConfigurer et DefaultConversionService dans la classe de configuration de votre Spring (celle avec annotée avec Configuration), par exemple,
et dans ta classe
et dans le fichier de propriétés
Sans DefaultConversionService, vous ne pouvez prendre une chaîne séparée par des virgules dans un tableau de chaînes que lorsque vous injectez la valeur dans votre champ, mais DefaultConversionService fait quelques magie pratique pour vous et les ajoutera à Collection, Array, etc. (vérifiez l'implémentation si vous le souhaitez) j'aimerais en savoir plus)
Avec ces deux, il gère même tous les espaces blancs redondants, y compris la nouvelle ligne, vous n'avez donc pas besoin d'ajouter de logiques supplémentaires pour les couper.
la source
vous pouvez le faire avec des annotations comme celle-ci
ici my.list.of.strings sera choisi dans le fichier de propriétés, s'il n'est pas là, alors les valeurs par défaut a, b, c seront utilisées
et dans votre fichier de propriétés, vous pouvez avoir quelque chose comme ça
my.list.of.strings = d, e, f
la source
Méfiez-vous des espaces dans les valeurs. Je peux me tromper, mais je pense que les espaces dans la liste séparée par des virgules ne sont pas tronqués en utilisant @Value et Spel. La liste
serait lu comme une liste de chaînes
Dans la plupart des cas, vous ne voudrez probablement pas les espaces!
L'expression
vous donnerait une liste de chaînes:
L'expression régulière supprime tous les espaces juste avant et juste après une virgule. Les espaces à l'intérieur des valeurs ne sont pas supprimés. Alors
devrait entraîner des valeurs
la source
@Value("#{'${foobar}'.trim().split( *, *)}")
Je pense que c'est plus simple pour saisir le tableau et supprimer les espaces:
la source
Dans mon cas d'une liste d'entiers fonctionne ceci:
Fichier de propriétés:
la source
Pensez à utiliser la configuration Commons. Il a intégré une fonctionnalité pour casser une entrée du fichier de propriétés dans un tableau / liste. Combiner avec SpEL et @Value devrait donner ce que vous voulez
Comme demandé, voici ce dont vous avez besoin (je n'ai pas vraiment essayé le code, j'ai peut-être quelques fautes de frappe, merci de me le faire):
Dans la configuration Apache Commons, il y a PropertiesConfiguration. Il prend en charge la fonction de conversion de chaîne délimitée en tableau / liste.
Par exemple, si vous avez un fichier de propriétés
Avec le code ci-dessous:
vous donnera un tableau de chaînes de
["bar1", "bar2", "bar3"]
Pour l'utiliser avec Spring, ayez ceci dans votre contexte d'application xml:
et avoir ceci dans votre haricot de printemps:
Je crois que cela devrait fonctionner: P
la source
Ma façon préférée (pour les chaînes, en particulier), est la suivante:
et utilise
De cette façon, vous pouvez également inclure des virgules dans votre paramètre. Cela fonctionne également pour les ensembles.
la source
si vous utilisez des espaces réservés de propriété, l'exemple ser1702544 deviendrait
Avec l'espace réservé xml:
la source
J'utilise Spring Boot 2.2.6
Mon dossier de propriété:
Mon code:
Ça fonctionne bien
la source