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

时间:2011-06-02 09:50:13

标签: java spring placeholder properties-file

我正在使用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并解析它,但是有更好的解决方案吗?

5 个答案:

答案 0 :(得分:145)

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

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

您可以在Java类中加载此类数组,如下所示:

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

答案 1 :(得分:20)

以下是如何在Spring 4.0 +

中执行此操作的示例

application.properties内容:

some.key=yes,no,cancel

Java代码:

@Autowire
private Environment env;

...

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

答案 2 :(得分:18)

除了逗号之外你还有一个不同的分隔符,你也可以使用它。

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

在您的应用程序属性中

my.config.values=value1, value2, value3

答案 3 :(得分:1)

使用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 Application类

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

}

答案 4 :(得分:0)

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

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

在yml文件中,我有:

dupRow_1 = pd.DataFrame({
        'Product':list('abcdef'),
         'Order ID':[np.nan,5,4,5,5,np.nan],

})
dupRow_1['Grouped'] = (dupRow_1['Product'].groupby(dupRow_1['Order ID'].fillna('missing'))
                                          .transform(lambda x: ','.join(x)))

print (dupRow_1)
  Product  Order ID Grouped
0       a       NaN     a,f
1       b       5.0   b,d,e
2       c       4.0       c
3       d       5.0   b,d,e
4       e       5.0   b,d,e
5       f       NaN     a,f

在Config类中,我有:

websocket:
  cors: "*"