Estoy cargando atributos de propiedades desde un .properties
archivo usando Spring de la siguiente manera:
file: elements.properties
base.module.elementToSearch=1
base.module.elementToSearch=2
base.module.elementToSearch=3
base.module.elementToSearch=4
base.module.elementToSearch=5
base.module.elementToSearch=6
El archivo xml de primavera
file: myapplication.xml
<bean id="some"
class="com.some.Class">
<property name="property" value="#{base.module.elementToSearch}" />
</bean>
Y mi Class.java
file: Class.java
public void setProperty(final List<Integer> elements){
this.elements = elements;
}
Pero al depurar, los elementos del parámetro solo incluyen el último elemento en la lista, por lo que hay una lista de un elemento con valor "6", en lugar de una lista con 6 elementos.
Probé otros enfoques, como agregar valor solo, #{base.module}
pero luego no encuentra ningún parámetro en el archivo de propiedades.
Una solución alternativa es tener en el archivo elements.properties una lista separada por comas, como:
base.module.elementToSearch=1,2,3,4,5,6
y utilícelo como una cadena y analícelo, pero ¿hay una solución mejor?
java
spring
placeholder
properties-file
RamonBoza
fuente
fuente
Respuestas:
Si define su matriz en el archivo de propiedades como:
base.module.elementToSearch=1,2,3,4,5,6
Puede cargar dicha matriz en su clase Java de esta manera:
@Value("${base.module.elementToSearch}") private String[] elementToSearch;
fuente
List<String>
de la misma manera no parece funcionar (la lista tendrá un solo elemento).String[]
como tipo funciona, donde el usoList<String>
no funciona.List<String>
lugar deString[]
, debe agregar al menos un<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
a suapplicationContext.xml
. De lo contrario, no se usa el servicio de conversión, sino los editores de propiedades predeterminados, que no admiten la conversión de cadenas en colecciones, solo matrices: docs.spring.io/spring/docs/current/spring-framework-reference/…Y en caso de que tenga un delimitador diferente a la coma, también puede usarlo.
@Value("#{'${my.config.values}'.split(',')}") private String[] myValues; // could also be a List<String>
y
en las propiedades de su aplicación podría tener
fuente
Aquí hay un ejemplo de cómo puede hacerlo en Spring 4.0+
application.properties
contenido:Código Java:
@Autowire private Environment env; ... String[] springRocks = env.getProperty("some.key", String[].class);
fuente
Con un Spring Boot se puede hacer lo siguiente:
application.properties
Clase de configuración
import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component; import java.util.ArrayList; import java.util.List; @Component @ConfigurationProperties public class Configuration { List<String> values = new ArrayList<>(); public List<String> getValues() { return values; } }
Esto es necesario, sin esta clase o sin la
values
clase en, no está funcionando.Clase de aplicación Spring Boot
import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import java.util.List; @SpringBootApplication public class SpringBootConsoleApplication implements CommandLineRunner { private static Logger LOG = LoggerFactory.getLogger(SpringBootConsoleApplication.class); // notice #{} is used instead of ${} @Value("#{configuration.values}") List<String> values; public static void main(String[] args) { SpringApplication.run(SpringBootConsoleApplication.class, args); } @Override public void run(String... args) { LOG.info("values: {}", values); } }
fuente
Si necesita pasar el símbolo de asterisco, debe envolverlo entre comillas.
En mi caso, necesito configurar cors para websockets. Entonces, decidí poner las URL de cors en application.yml. Para prod env usaré URL específicas, pero para dev está bien usar solo *.
En el archivo yml tengo:
websocket: cors: "*"
En la clase de configuración tengo:
@Value("${websocket.cors}") private String[] cors;
fuente