Lecture d’une liste à partir d’un fichier de propriétés et chargement avec une annotation de spring @Value

Semblable à cette question: http://forum.springsource.org/showthread.php?111992-Loading-a-list-from-properties-file-using-Value-annotation (pour lequel il n’y a pas de réponse)

Je souhaite avoir une liste de valeurs dans un fichier .properties, à savoir:

my.list.of.ssortingngs=ABC,CDE,EFG 

Et pour le charger directement dans ma classe, à savoir:

 @Value("${my.list.of.ssortingngs}") private List myList; 

Si je comprends bien, une alternative consiste à l’avoir dans le fichier de configuration du spring, et de le charger comme une référence au bean (corrigez-moi si je me trompe), c.-à-d.

   ABC CDE EFG   

Mais y a-t-il un moyen de le faire? utiliser un fichier .properties? ps: je voudrais faire cela avec un code personnalisé si possible.

Utiliser Spring EL:

 @Value("#{'${my.list.of.ssortingngs}'.split(',')}") private List myList; 

En supposant que votre fichier de propriétés est chargé correctement avec les éléments suivants:

 my.list.of.ssortingngs=ABC,CDE,EFG 

Depuis Spring 3.0, vous pouvez append une ligne comme

  

à votre applicationContext.xml (ou où vous configurez les choses). Comme Dmitry Chornyi le souligne dans un commentaire, la configuration basée sur Java ressemble à ceci:

 @Bean public ConversionService conversionService() { return new DefaultConversionService(); } 

Cela active le nouveau service de configuration qui prend en charge la conversion des types Ssortingng en Collection . Si vous n’activez pas ce service de configuration, Spring s’appuie 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:

 @Value("${my.list.of.ints}") private List myList 

travaillera avec une ligne comme

  my.list.of.ints= 1, 2, 3, 4 

Aucun problème avec les espaces blancs, le ConversionServiceFactoryBean s’en charge.

Voir http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/#core-convert-Spring-config

Dans une application Spring, vous configurez généralement une instance ConversionService par conteneur Spring (ou ApplicationContext). Ce ConversionService sera récupéré par Spring et ensuite utilisé chaque fois qu’une conversion de type doit être effectuée par le framework. […] Si aucun ConversionService n’est enregistré avec Spring, le système d’origine basé sur PropertyEditor est utilisé.

En spécifiant le my.list.of.ssortingngs=ABC,CDE,EFG dans .properties et en utilisant

@Value("${my.list.of.ssortingngs}") private Ssortingng[] mySsortingng;

Vous pouvez obtenir les tableaux de chaînes. Et en utilisant CollectionUtils.addAll(myList, mySsortingng) , vous pouvez obtenir la liste des chaînes.

Avez-vous considéré @Autowired le constructeur ou un setter et Ssortingng.split() ing dans le corps?

 class MyClass { private List myList; @Autowired public MyClass(@Value("${my.list.of.ssortingngs}") final Ssortingng strs) { myList = Arrays.asList(strs.split(",")); } //or @Autowired public void setMyList(@Value("${my.list.of.ssortingngs}") final Ssortingng strs) { myList = Arrays.asList(strs.split(",")); } } 

J’ai tendance à préférer faire un auto-achat de l’une des manières suivantes pour améliorer la testabilité de mon code.

Toutes les réponses ci-dessus sont correctes. Mais vous pouvez y parvenir en une seule ligne. Veuillez essayer de suivre la déclaration et vous obtiendrez toutes les valeurs séparées par des virgules dans une liste de chaînes.

 private @Value("#{T(java.util.Arrays).asList(projectProperties['my.list.of.ssortingngs'])}") List myList; 

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é.

Si vous lisez ceci et que vous utilisez Spring Boot , vous avez une option supplémentaire pour cette fonctionnalité

Habituellement, la liste séparée par des virgules est très maladroite pour les cas d’utilisation réels (et parfois même pas réalisable si vous souhaitez utiliser des virgules dans votre configuration):

 email.sendTo=somebody@example.com,somebody2@example.com,somebody3@example.com,..... 

Avec Spring Boot , vous pouvez l’écrire comme ceci (Index à partir de 0):

 email.sendTo[0]=somebody@example.com email.sendTo[1]=somebody2@example.com email.sendTo[2]=somebody3@example.com 

Et utilisez-le comme ceci:

 @Component @ConfigurationProperties("email") public class EmailProperties { private List sendTo; public List getSendTo() { return sendTo; } public void setSendTo(List sendTo) { this.sendTo = sendTo; } } @Component public class EmailModel { @Autowired private EmailProperties emailProperties; //Use the sendTo List by //emailProperties.getSendTo() } @Configuration public class YourConfiguration { @Bean public EmailProperties emailProperties(){ return new EmailProperties(); } } #Put this in src/main/resource/META-INF/spring.factories org.springframework.boot.autoconfigure.EnableAutoConfiguration=example.compackage.YourConfiguration 

vous pouvez le faire avec des annotations comme celle-ci

  @Value("#{T(java.util.Arrays).asList('${my.list.of.ssortingngs:a,b,c}')}") private List mylist; 

ici my.list.of.ssortingngs sera choisi dans le fichier de propriétés, si ce 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.ssortingngs = d, e, f

Envisagez d’utiliser la configuration de Commons. Il a intégré fonctionnalité pour casser une entrée dans le fichier de propriétés à tableau / liste. Combiner avec SpEL et @Value devrait donner ce que vous voulez


Comme demandé, voici ce dont vous avez besoin.

Dans Apache Commons Configuration, il y a PropertiesConfiguration. Il prend en charge la fonctionnalité de conversion de chaîne délimitée en tableau / liste.

Par exemple, si vous avez un fichier de propriétés

 #Foo.properties foo=bar1, bar2, bar3 

Avec le code ci-dessous:

 PropertiesConfiguration config = new PropertiesConfiguration("Foo.properties"); Ssortingng[] values = config.getSsortingngArray("foo"); 

vous donnera un tableau de chaînes de ["bar1", "bar2", "bar3"]

Pour utiliser Spring, utilisez ceci dans votre contexte d’application xml:

    

et avoir ceci dans votre fève de spring:

 public class SomeBean { @Value("fooConfig.getSsortingngArray('foo')") private Ssortingng[] fooArray; } 

Je crois que cela devrait fonctionner: P

Attention aux espaces dans les valeurs. Je peux me tromper, mais je pense que les espaces de la liste séparée par des virgules ne sont pas tronqués avec @Value et Spel. La liste

 foobar=a, b, c 

serait lu comme une liste de chaînes

 "a", " b", " c" 

Dans la plupart des cas, vous ne voudriez probablement pas les espaces!

L’expression

 @Value("#{'${foobar}'.sortingm().replaceAll(\"\\s*(?=,)|(?< =,)\\s*\", \"\").split(',')}") private List foobarList; 

vous donnerait une liste de chaînes:

 "a", "b", "c". 

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

 foobar = AA, BB, CCC 

devrait aboutir à des valeurs

 "AA", "BB", "CCC". 

si l’utilisation d’espaces réservés propriété alors l’exemple ser1702544 deviendrait

 @Value("#{myConfigProperties['myproperty'].sortingm().replaceAll(\"\\s*(?=,)|(?< =,)\\s*\", \"\").split(',')}") 

Avec espace réservé xml:

   $myConfigProperties{     classpath:myprops.properties