108

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

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

春天的xml文件

file: myapplication.xml
<bean id="some"
      class="com.some.Class">
      <property name="property" value="#{base.module.elementToSearch}" />
</bean>

还有我的 Class.java

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

并将其用作字符串并解析它,但是有更好的解决方案吗?

4

5 回答 5

215

如果您在属性文件中定义数组,例如:

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

你可以像这样在你的 Java 类中加载这样的数组:

  @Value("${base.module.elementToSearch}")
  private String[] elementToSearch;
于 2011-06-20T13:50:30.850 回答
43

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

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

在您的应用程序属性中,您可以拥有

my.config.values=value1, value2, value3
于 2016-08-19T13:04:21.757 回答
35

这是一个如何在 Spring 4.0+ 中执行此操作的示例

application.properties内容:

some.key=yes,no,cancel

Java 代码:

@Autowire
private Environment env;

...

String[] springRocks = env.getProperty("some.key", String[].class);
于 2015-11-26T17:20:43.723 回答
9

使用 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类它不起作用。

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

}
于 2020-01-11T19:51:49.803 回答
-1

如果您需要传递星号符号,则必须用引号将其括起来。

就我而言,我需要为 websockets 配置 cors。因此,我决定将 cors url 放入 application.yml。对于 prod env,我将使用特定的 url,但对于 dev,只使用 *.

在 yml 文件中,我有:

websocket:
  cors: "*"

在 Config 类中,我有:

@Value("${websocket.cors}")
private String[] cors;
于 2020-02-28T09:27:44.033 回答