297 votes

Lecture d'une liste à partir d'un fichier de propriétés et chargement avec l'annotation printanière @Value

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

Je veux avoir une liste de valeurs dans un .fichier de propriétés, c'est à dire:

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

Et de le charger dans ma classe, c'est à dire:

@Value("${my.list.of.strings}")
private List<String> myList;

Ce que je comprends, une alternative de le faire, c'est de l'avoir dans le ressort fichier de config, et de le charger comme un haricot de référence (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 est-il possible de faire cela? à l'aide d'un .fichier de propriétés? ps: je voudrais faire cela avec code personnalisé si possible.

556voto

Wilhelm Kleu Points 2682

Utilisation de Spring EL:

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

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

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

20voto

nicholas.hauschild Points 21796

Avez-vous envisagé @Autowired du constructeur ou un poseur et String.split() du corps?

 class MyClass {
    private List<String> myList;

    @Autowired
    public MyClass(@Value("${my.list.of.strings}") final String strs) {
        myList = Arrays.asList(strs.split(","));
    }

    //or

    @Autowired
    public void setMyList(@Value("${my.list.of.strings}") final String strs) {
        myList = Arrays.asList(strs.split(","));
    }
}
 

J'ai tendance à préférer effectuer l'auto-recrutement d'une de ces manières pour améliorer la testabilité de mon code.

10voto

Japs Points 2964

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 une virgule dans une liste de chaînes.

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

Et vous devez également définir la ligne suivante dans votre configuration XML.

 <util:properties id="projectProperties" location="/project.properties"/>
 

remplacez simplement le chemin et le nom de votre fichier de propriétés. Et vous êtes prêt à partir. :)

J'espère que cela vous aide. À votre santé.

1voto

Adrian Shum Points 10784

Envisager d'utiliser des Communes de Configuration. Il ont construit dans la fonctionnalité de briser une entrée dans le fichier de propriétés de tableau/liste. Peignage avec SpEL et @Valeur doit donner ce que vous voulez


Comme demandé, voici ce dont vous avez besoin (n'ai pas vraiment essayé le code, peuvent obtenu certains typoes, s'il vous plaît garder avec moi):

Dans Apache Commons Configuration, il est PropertiesConfiguration. Il prend en charge la fonctionnalité de conversion de chaîne délimitée de 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");
String[] values = config.getStringArray("foo");

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

À utiliser avec le Printemps, c'est en votre app contexte xml:

<bean id="fooConfig" class="org.apache.commons.configuration.PropertiesConfiguration">
    <constructor-arg type="java.lang.String" value="classpath:/Foo.properties"/>
</bean>

et c'est en votre printemps bean:

public class SomeBean {

    @Value("fooConfig.getStringArray('foo')")
    private String[] fooArray;
}

Je crois que cela devrait fonctionner :P

0voto

cgull Points 11

si vous utilisez des espaces réservés de propriété, ser1702544 par exemple deviendrait

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

Avec espace réservé xml:

 <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">   
    <property name="properties" ref="myConfigProperties" />
    <property name="placeholderPrefix"><value>$myConfigProperties{</value></property>
</bean>    

<bean id="myConfigProperties" class="org.springframework.beans.factory.config.PropertiesFactoryBean">
     <property name="locations">
         <list>
                <value>classpath:myprops.properties</value>
         </list>
     </property>
</bean> 
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X