Quiero tener una lista de valores en un archivo .properties, es decir:
my.list.of.strings=ABC,CDE,EFG
Y para 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 Spring y cargarlo como referencia de bean (corrígeme si me equivoco), es decir
<bean name="list">
<list>
<value>ABC</value>
<value>CDE</value>
<value>EFG</value>
</list>
</bean>
¿Pero hay alguna forma de hacer esto? utilizando un archivo .properties? ps: me gustaría hacer esto sin ningún código personalizado si es posible.
java
spring
spring-properties
JackDev
fuente
fuente
org.springframework.expression.spel.SpelEvaluationException
excepción y nojavax.el.ELException
. ¿Tu objeción es creada por Spring?my.list.of.strings=
? Esperaría tal funcionalidad reajustando la lista vacía donde aquí será un elemento (cadena vacía), ¿no?item1, item2, item3
pueden dar un resultado que realmente no espera (pista: espacios).@Value("#{'${my.list.of.strings}'.split(',\\s*')}")
Desde Spring 3.0, puede agregar una línea como
a su
applicationContext.xml
(o donde configura las cosas). Como Dmitry Chornyi señala en un comentario, la configuración basada en Java se ve así:Esto activa el nuevo servicio de configuración que admite la conversión
String
aCollection
tipos. Si no activa este servicio de configuración, Spring recurre a sus editores de propiedades heredados como servicios de configuración, que no admiten este tipo de conversión.La conversión a colecciones de otros tipos también funciona:
funcionará con una línea como
No hay problemas con el espacio en blanco allí,
ConversionServiceFactoryBean
se encarga de eso.Ver http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/#core-convert-Spring-config
fuente
split()
en cada expresión, también maneja adecuadamente una lista vacía en lugar de darte[null]
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 a veces ni siquiera es factible, si desea usar comas en su configuración):
Con Spring Boot , puede escribirlo así (el índice comienza en 0):
Y úsalo así:
fuente
Al especificar el
my.list.of.strings=ABC,CDE,EFG
archivo in .properties y usar@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.fuente
¿Has considerado
@Autowired
incorporar al constructor o un setter eString.split()
incorporar al cuerpo?Tiendo a preferir hacer mi cableado automático de una de estas formas para mejorar la capacidad de prueba de mi código.
fuente
Si está utilizando Spring Boot 2, funciona como está, sin ninguna configuración adicional.
fuente
private List<String> myList;
Todas las respuestas anteriores son correctas. Pero puede lograr esto en una sola línea. Intente con la siguiente declaración y obtendrá todos los valores separados por comas en una lista de cadenas.
Y también debe tener la siguiente línea definida en su configuración xml.
simplemente reemplace la ruta y el nombre del archivo de propiedades. Y eres bueno para ir. :)
Espero que esto te ayude. Salud.
fuente
@Value("#{T(java.util.Arrays).asList('${my.list.of.strings}')}")
Si está utilizando la última versión de Spring Framework (Spring 3.1+, creo), no necesita esas cosas de división de cadenas en SpringEL,
Simplemente agregue PropertySourcesPlaceholderConfigurer y DefaultConversionService en la clase de configuración de Spring (la que está anotada con Configuration), por ejemplo,
y en tu clase
y en el archivo de propiedades
Sin DefaultConversionService, solo puede tomar una cadena separada por comas en una matriz de cadenas cuando inyecta el valor en su campo, pero DefaultConversionService hace algunas magias convenientes para usted y las agregará a Collection, Array, etc. (verifique la implementación si desea me gustaría saber más al respecto)
Con estos dos, incluso maneja todos los espacios en blanco redundantes, incluida la nueva línea, por lo que no necesita agregar lógicas adicionales para recortarlos.
fuente
puedes hacer esto con anotaciones como esta
aquí my.list.of.strings se seleccionará del archivo de propiedades, si no está allí, se utilizará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
fuente
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
se leería como una lista de cadenas
¡En la mayoría de los casos, probablemente no quieras los espacios!
La expresion
te daría una lista de cadenas:
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. Entonces
debe dar lugar a valores
fuente
@Value("#{'${foobar}'.trim().split( *, *)}")
Creo que esto es más simple para agarrar la matriz y eliminar espacios:
fuente
En mi caso de una lista de enteros funciona esto:
Archivo de propiedad:
fuente
Considere usar la configuración de Commons. Tiene una función integrada para dividir una entrada en el archivo de propiedades en la matriz / lista. Combinar con SpEL y @Value debería darte lo que quieres
Según lo solicitado, esto es lo que necesita (Realmente no he probado el código, puede tener algunos errores tipográficos, tenga paciencia conmigo):
En la configuración de Apache Commons, hay propiedades de configuración. Admite la función de convertir cadenas delimitadas a matriz / lista.
Por ejemplo, si tiene un archivo de propiedades
Con el siguiente código:
le dará una serie de cadenas de
["bar1", "bar2", "bar3"]
Para usar con Spring, tenga esto en el contexto de su aplicación xml:
y ten esto en tu haba de primavera:
Creo que esto debería funcionar: P
fuente
Mi forma preferida (para cadenas, en particular), es la siguiente:
y use
De esta manera, puede incluir también comas en su parámetro. Funciona también para conjuntos.
fuente
si usa marcadores de posición de propiedad, entonces el ejemplo ser1702544 se convertiría en
Con marcador de posición xml:
fuente
Estoy usando Spring Boot 2.2.6
Mi archivo de propiedad:
Mi código:
Funciona bien
fuente