我想在.properties文件中有一个值列表,即:

my.list.of.strings=ABC,CDE,EFG

并直接在我的类中加载它,即:

@Value("${my.list.of.strings}")
private List<String> myList;

据我所知,另一种方法是将它放在spring配置文件中,并将其作为bean引用加载(如果我错了请纠正我),即

<bean name="list">
 <list>
  <value>ABC</value>
  <value>CDE</value>
  <value>EFG</value>
 </list>
</bean>

但是有没有办法做到这一点呢?使用.properties文件? ps:如果可能的话,我想这样做没有任何自定义代码。


当前回答

这个问题的答案

@Value("#{'${my.list.of.strings}'.split(',')}") 
private List<String> myList; 

对逗号分隔的值按预期工作。 为了处理null(当属性未指定时),添加默认值(':'在属性名之后)为空字符串,如下所示:

@Value("#{'${my.list.of.strings: }'.split(',')}")

其他回答

这个问题的答案

@Value("#{'${my.list.of.strings}'.split(',')}") 
private List<String> myList; 

对逗号分隔的值按预期工作。 为了处理null(当属性未指定时),添加默认值(':'在属性名之后)为空字符串,如下所示:

@Value("#{'${my.list.of.strings: }'.split(',')}")

如果您正在阅读这篇文章,并且正在使用Spring Boot,那么对于这个特性,您还有另外一个选项

通常逗号分隔的列表在现实世界中是非常笨拙的 (有时甚至是不可行的,如果你想在你的配置中使用逗号):

email.sendTo=somebody@example.com,somebody2@example.com,somebody3@example.com,.....

使用Spring Boot,你可以这样写(索引从0开始):

email.sendTo[0]=somebody@example.com
email.sendTo[1]=somebody2@example.com
email.sendTo[2]=somebody3@example.com

像这样使用它:

@Component
@ConfigurationProperties("email")
public class EmailProperties {

    private List<String> sendTo;

    public List<String> getSendTo() {
        return sendTo;
    }

    public void setSendTo(List<String> sendTo) {
        this.sendTo = sendTo;
    }

}


@Component
public class EmailModel {

  @Autowired
  private EmailProperties emailProperties;

  //Use the sendTo List by 
  //emailProperties.getSendTo()

}



@Configuration
public class YourConfiguration {
    @Bean
  public EmailProperties emailProperties(){
        return new EmailProperties();
  }

}


#Put this in src/main/resource/META-INF/spring.factories
  org.springframework.boot.autoconfigure.EnableAutoConfiguration=example.compackage.YourConfiguration

我更喜欢的方式(特别是字符串)是以下一个:

admin.user={'Doe, John','Headroom, Max','Mouse, Micky'}

和使用

@Value("#{${admin.user}}")
private List<String> userList;

通过这种方式,还可以在参数中包含逗号。它也适用于集合。

注意值中的空格。我可能错了,但我认为逗号分隔列表中的空格没有使用@Value和Spel截断。列表

foobar=a, b, c

会被读入一个字符串列表吗

"a", " b", " c"

在大多数情况下,您可能不想要空格!

表达式

@Value("#{'${foobar}'.trim().replaceAll(\"\\s*(?=,)|(?<=,)\\s*\", \"\").split(',')}")
private List<String> foobarList;

会给你一个字符串列表

"a", "b", "c".

正则表达式删除逗号前面和后面的所有空格。值中的空格不会被删除。所以

foobar = AA, B B, CCC

应该得到的值

"AA", "B B", "CCC".

从Spring 3.0开始,你可以添加一行像

<bean id="conversionService" 
    class="org.springframework.context.support.ConversionServiceFactoryBean" />

到你的applicationContext.xml(或者你配置的地方)。 正如Dmitry Chornyi在评论中指出的那样,基于Java的配置看起来是这样的:

@Bean public ConversionService conversionService() {
    return new DefaultConversionService();
}

这将激活新的配置服务,该服务支持将字符串转换为集合类型。 如果您不激活这个配置服务,Spring将依赖其遗留属性编辑器作为配置服务,它不支持这种类型的转换。

转换为其他类型的集合也可以:

@Value("${my.list.of.ints}")
private List<Integer> myList

会不会跟线条一样

 my.list.of.ints= 1, 2, 3, 4

这里的空白没有问题,ConversionServiceFactoryBean会处理它。

看到http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/ core-convert-Spring-config

在Spring应用程序中,通常为每个Spring容器(或ApplicationContext)配置一个ConversionService实例。该ConversionService将被Spring拾取,然后在框架需要执行类型转换时使用。 […] 如果没有向Spring注册ConversionService,则使用原始的基于properteditor的系统。