Spring .properties file: get element as an Array

我正在使用 Spring 从一个 .properties文件加载 properties 属性,如下所示:

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>

还有我的课

file: Class.java
public void setProperty(final List<Integer> elements){
this.elements = elements;
}

但是在调试时,参数元素只将最后一个元素放入列表中,因此,列表中的一个元素值为“6”,而不是一个包含6个元素的列表。

我尝试了其他方法,比如只添加值 #{base.module},但是它在属性文件中找不到任何参数。

变通方法是在 elements.properties 文件中用逗号分隔一个列表,比如:

base.module.elementToSearch=1,2,3,4,5,6

并将其用作 String 并对其进行解析,但是有更好的解决方案吗?

166975 次浏览

如果在属性文件中定义数组,如下所示:

base.module.elementToSearch=1,2,3,4,5,6

您可以像下面这样在 Java 类中加载这样的数组:

  @Value("${base.module.elementToSearch}")
private String[] elementToSearch;

下面是一个如何在 Spring 4.0 + 中实现的示例

application.properties内容:

some.key=yes,no,cancel

Java 代码:

@Autowire
private Environment env;


...


String[] springRocks = env.getProperty("some.key", String[].class);

如果您使用逗号以外的其他分隔符,也可以使用该分隔符。

@Value("#{'${my.config.values}'.split(',')}")
private String[] myValues;   // could also be a List<String>

还有

在您的应用程序属性中

my.config.values=value1, value2, value3

使用 Spring Boot 可以执行以下操作:

应用性能

values[0]=abc
values[1]=def

配置类

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;
}


}

这是必要的,没有这个类或者没有 values在类中它是不工作的。

SpringBootApplication 类

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);
}


}

如果需要传递星号符号,则必须用引号包装它。

在我的例子中,我需要为 websockets 配置 cors。所以,我决定把 cors url 放到 application.yml 中。对于 prod env,我将使用特定的 url,但对于 dev,可以只使用 * 。

在 yml 文件中我有:

websocket:
cors: "*"

In Config class I have:

@Value("${websocket.cors}")
private String[] cors;