Spring .properties file: get element as an Array
I'm loading properties attributes from a .properties
file using Spring as follows:
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
The spring xml file
file: myapplication.xml
<bean id="some"
class="com.some.Class">
<property name="property" value="#{base.module.elementToSearch}" />
</bean>
And my Class.java
file: Class.java
public void setProperty(final List<Integer> elements){
this.elements = elements;
}
But when debugging, the parameter elements only get the last element into the list, so, there is a list of one element with value "6", instead of a list with 6 elements.
I tried other approaches, like adding in value only #{base.module}
but then it finds no parameter in the properties file.
A workaround is to have in elements.properties file a list separated by commas, like:
base.module.elementToSearch=1,2,3,4,5,6
and use it as a String and parse it, but is there a better solution?
Solution 1:
If you define your array in properties file like:
base.module.elementToSearch=1,2,3,4,5,6
You can load such array in your Java class like this:
@Value("${base.module.elementToSearch}")
private String[] elementToSearch;
Solution 2:
And incase you a different delimiter other than comma, you can use that as well.
@Value("#{'${my.config.values}'.split(',')}")
private String[] myValues; // could also be a List<String>
and
in your application properties you could have
my.config.values=value1, value2, value3
Solution 3:
Here is an example of how you can do it in Spring 4.0+
application.properties
content:
some.key=yes,no,cancel
Java Code:
@Autowire
private Environment env;
...
String[] springRocks = env.getProperty("some.key", String[].class);
Solution 4:
With a Spring Boot one can do the following:
application.properties
values[0]=abc
values[1]=def
Configuration class
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;
}
}
This is needed, without this class or without the values
in class it is not working.
Spring Boot Application class
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);
}
}