propertysource property leer example context application java spring spring-properties

java - property - spring boot configuration properties



Leer una lista del archivo de propiedades y cargarla con la anotaciĆ³n de primavera @ Valor (10)

¿Has considerado @Autowired ing the constructor o setter y String.split() ing en el cuerpo?

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(",")); } }

Tiendo a preferir hacer mi autovínculo de una de estas maneras para mejorar la capacidad de prueba de mi código.

Similar a esta pregunta: http://forum.springsource.org/showthread.php?111992-Loading-a-list-from-properties-file-using-Value-annotation (para el que no hay respuesta)

Quiero tener una lista de valores en un archivo .properties, es decir:

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

Y cargarlo en mi clase directamente, es decir:

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

Según tengo entendido, una alternativa para hacer esto es tenerlo en el archivo de configuración de primavera y cargarlo como referencia de bean (corríjanme si estoy equivocado), es decir,

<bean name="list"> <list> <value>ABC</value> <value>CDE</value> <value>EFG</value> </list> </bean>

Pero, ¿hay alguna forma de hacer esto? usando un archivo .properties? ps: me gustaría hacer esto sin ningún código personalizado, si es posible.


Considera usar la configuración de Commons. Se ha incorporado la función para dividir una entrada en el archivo de propiedades a matriz / lista. Peinar con SpEL y @Value debería dar lo que quieras

Según lo solicitado, esto es lo que necesita (Realmente no he probado el código, puede haber algunos errores, por favor tengan paciencia conmigo):

En Apache Commons Configuration, hay PropertiesConfiguration. Es compatible con la función de convertir cadena delimitada a matriz / lista.

Por ejemplo, si tiene un archivo de propiedades

#Foo.properties foo=bar1, bar2, bar3

Con el siguiente código:

PropertiesConfiguration config = new PropertiesConfiguration("Foo.properties"); String[] values = config.getStringArray("foo");

le dará una matriz de cadenas de ["bar1", "bar2", "bar3"]

Para usar con Spring, tenga esto en su contexto de aplicación xml:

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

y ten esto en tu bean de primavera:

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

Creo que esto debería funcionar: P


Desde Spring 3.0, puedes agregar una línea como

<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean" />

a su applicationContext.xml (o donde configura cosas). Como señala Dmitry Chornyi en un comentario, la configuración basada en Java se ve así:

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

Esto activa el nuevo servicio de configuración que admite la conversión de String a tipos de Collection . Si no activa este servicio de configuración, Spring recurre a sus editores heredados de propiedades como servicios de configuración, que no admiten este tipo de conversión.

La conversión a colecciones de otros tipos también funciona:

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

funcionará con una línea como

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

No hay problemas con el espacio en blanco allí, ConversionServiceFactoryBean se ocupa de ello.

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

En una aplicación de Spring, normalmente se configura una instancia de ConversionService por contenedor Spring (o ApplicationContext). Ese servicio de conversión será recogido por Spring y luego se usará siempre que el framework deba realizar una conversión de tipo. [...] Si no se registra ConversionService con Spring, se usa el sistema original basado en PropertyEditor.


Especificando my.list.of.strings=ABC,CDE,EFG en el archivo .properties y usando

@Value("${my.list.of.strings}") private String[] myString;

Puede obtener las matrices de cadenas. Y usando CollectionUtils.addAll(myList, myString) , puede obtener la lista de cadenas.


Si está leyendo esto y está utilizando Spring Boot , tiene 1 opción más para esta función

Por lo general, la lista separada por comas es muy torpe para el caso de uso del mundo real (y en ocasiones ni siquiera es factible, si quieres usar comas en tu configuración):

[email protected],[email protected],[email protected],.....

Con Spring Boot , puede escribirlo de la siguiente manera (Index start at 0):

email.sendTo[0][email protected] email.sendTo[1][email protected] email.sendTo[2][email protected]

Y úsalo así:

@Component @ConfigurationProperties("email") public class EmailProperties { private List<String> sendTo; public List<String> getSendTo() { return sendTo; } public void setSendTo(List<String> 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


Todas las respuestas anteriores son correctas. Pero puedes lograr esto en una sola línea. Intenta seguir la declaración y obtendrás todos los valores separados por comas en una lista de cadenas.

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

Y también necesita tener la siguiente línea definida en su configuración xml.

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

simplemente reemplace la ruta y el nombre de archivo de su archivo de propiedades. Y eres bueno para ir. :)

Espero que esto te ayude. Aclamaciones.


Usando Spring EL:

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

Suponiendo que su archivo de propiedades se carga correctamente con lo siguiente:

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


puedes hacer esto con anotaciones como esta

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

aquí mi.list.of.strings se elegirá del archivo de propiedades, si no está allí, se usarán los valores predeterminados a, b, c

y en su archivo de propiedades, puede tener algo como esto

my.list.of.strings = d, e, f


si se utilizan marcadores de posición de propiedad, entonces el ejemplo ser1702544 se convertiría

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

Con placeholder 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>


Cuidado con los espacios en los valores. Podría estar equivocado, pero creo que los espacios en la lista separada por comas no se truncan usando @Value y Spel. La lista

foobar=a, b, c

se leería como una lista de cadenas

"a", " b", " c"

¡En la mayoría de los casos, probablemente no quieras los espacios!

La expresion

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

le daría una lista de cadenas:

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

La expresión regular elimina todos los espacios justo antes y justo después de una coma. Los espacios dentro de los valores no se eliminan. Asi que

foobar = AA, B B, CCC

debería dar como resultado valores

"AA", "B B", "CCC".