Spring .properties文件:将元素作为数组获取


91

我正在.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

Spring 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

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



所以我需要将其作为逗号分隔的字符串传递并在方法中进行解析。
RamonBoza 2011年

确实,尽管已经有一些库为您做到这一点(apache 共同点
Colin Hebert,

这是一个至少给您Set <String>结果的答案。不是一个List <String>,但在许多情况下可能足够了!stackoverflow.com/questions/5274362/…–
约翰·里克斯

Answers:


189

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

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

您可以像这样在Java类中加载此类数组:

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

5
我的元素包含逗号。我如何逃脱分隔符?“ \”甚至“ \\”都不起作用。
banterCZ 2012年

您可以尝试将它们作为整数列表获取,然后将其转换为@Value(“ $ {base.module.elementToSearch}”)private List <Integer> elementToSearch;
Gal Bracha 2012年

+1,正是我所需要的。不幸的是List<String>,以相同的方式将逗号分隔的值读入a 似乎不起作用(列表中只有一个元素)。
约尼克,

4
我可以确认使用String[]as类型有效,而using List<String>无效。
Wim Deblauwe 2014年

2
如果你想这工作,List<String>而不是String[],你需要至少一个添加<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">到您的applicationContext.xml。否则,将不使用的转换服务,但默认的属性编辑器,不支持将字符串转换为收藏品,只有数组:docs.spring.io/spring/docs/current/spring-framework-reference/...
克莱门斯·克莱因,Robbenhaar

36

而且,如果您使用逗号以外的其他定界符,也可以使用它。

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

在您的应用程序属性中

my.config.values=value1, value2, value3

这种用法也可以与其他注释一起使用,例如@KafkaListener {topics =“#{'$ {ArrayProperty}'。split(',')}”}}用于春季kafka侦听器
AsyncTask

32

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

application.properties 内容:

some.key=yes,no,cancel

Java代码:

@Autowire
private Environment env;

...

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

这就是我想要的,但是在环境变量中...我应该能够在环境变量中使用SOME_KEY_0_ =是SOME_KEY_1 = no,等等,但是我的getProperty返回null
Rhubarb

0

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

application.properties

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

}

这是必需的,如果没有此类或没有valuesin类,它将不起作用。

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

}

0

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

就我而言,我需要为websocket配置cors。因此,我决定将cors网址放入application.yml。对于prod env,我将使用特定的URL,但对于dev,可以仅使用*。

在yml文件中,我有:

websocket:
  cors: "*"

在配置类中,我有:

@Value("${websocket.cors}")
private String[] cors;
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.