【问题标题】:Spring .properties file: get element as an ArraySpring .properties 文件:将元素作为数组获取
【发布时间】:2011-09-06 23:03:08
【问题描述】:

我正在使用 Spring 从.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

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来解析,但是有没有更好的解决方案呢?

【问题讨论】:

标签: java spring placeholder properties-file


【解决方案1】:

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

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

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

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

【讨论】:

  • 我的元素包含逗号。如何转义分隔符? '\,' 甚至 '\\,' 都不起作用。
  • 您可以尝试将它们作为整数列表获取,然后将它们转换为 @Value("${base.module.elementToSearch}") private List elementToSearch;
  • +1,正是我所需要的。不幸的是,以同样的方式将逗号分隔的值读入List&lt;String&gt; 似乎不起作用(列表将只有一个元素)。
  • 我可以确认使用String[] 作为类型有效,而使用List&lt;String&gt; 则无效。
  • 如果您希望它与List&lt;String&gt; 而非String[] 一起使用,您需要在applicationContext.xml 中至少添加一个&lt;bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean"&gt;。否则不使用转换服务,而是使用默认属性编辑器,不支持将字符串转换为集合,仅支持数组:docs.spring.io/spring/docs/current/spring-framework-reference/…
【解决方案2】:

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

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

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

my.config.values=value1, value2, value3

【讨论】:

  • 这种用法也适用于其他注解,我像 @KafkaListener{topics= "#{'${ArrayProperty}'.split(',')}"} 使用了 spring kafka 监听器
【解决方案3】:

这是一个在 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_=yes SOME_KEY_1=no 等,但我的 getProperty 回来为空
【解决方案4】:

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

}

这是必需的,没有这个类或没有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);
    }

}

【讨论】:

    【解决方案5】:

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

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

    在 yml 文件中我有:

    websocket:
      cors: "*"
    

    在 Config 类中我有:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-06-30
      • 1970-01-01
      • 1970-01-01
      • 2016-10-07
      • 1970-01-01
      • 1970-01-01
      • 2014-06-29
      • 1970-01-01
      相关资源
      最近更新 更多