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

Ram*_*oza 79 java spring placeholder properties-file

我正在.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
Run Code Online (Sandbox Code Playgroud)

spring xml文件

file: myapplication.xml
<bean id="some"
      class="com.some.Class">
      <property name="property" value="#{base.module.elementToSearch}" />
</bean>
Run Code Online (Sandbox Code Playgroud)

还有我的Class.java

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

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

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

解决方法是在elements.properties文件中包含以逗号分隔的列表,例如:

base.module.elementToSearch=1,2,3,4,5,6
Run Code Online (Sandbox Code Playgroud)

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

svl*_*ada 166

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

base.module.elementToSearch=1,2,3,4,5,6
Run Code Online (Sandbox Code Playgroud)

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

  @Value("${base.module.elementToSearch}")
  private String[] elementToSearch;
Run Code Online (Sandbox Code Playgroud)

  • 我的元素包含逗号.如何逃脱分离器?'\,'甚至'\\','不行. (5认同)
  • 我可以确认使用`String []`作为类型工作,使用`List <String>`不起作用. (4认同)
  • 如果你想使用`List <String>`而不是`String []`,你需要至少添加一个`<bean id ="conversionService"class ="org.springframework.context.support.ConversionServiceFactoryBean"> `到你的`applicationContext.xml`.否则,不使用转换服务,但默认属性编辑器(不支持将字符串转换为集合)仅使用数组:http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/#核心转换弹簧,配置 (2认同)

R K*_*jal 29

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

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

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

my.config.values=value1, value2, value3
Run Code Online (Sandbox Code Playgroud)


小智 25

这是一个如何在Spring 4.0+中完成它的示例

application.properties 内容:

some.key=yes,no,cancel
Run Code Online (Sandbox Code Playgroud)

Java代码:

@Autowire
private Environment env;

...

String[] springRocks = env.getProperty("some.key", String[].class);
Run Code Online (Sandbox Code Playgroud)


Bet*_*sta 7

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

应用程序属性

values[0]=abc
values[1]=def
Run Code Online (Sandbox Code Playgroud)

配置类

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

}
Run Code Online (Sandbox Code Playgroud)

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

}
Run Code Online (Sandbox Code Playgroud)