从属性文件中读取List,并使用spring注释@Value加载

我想在.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:如果可能的话,我想这样做,不需要任何自定义代码
421798 次浏览

你是否考虑过在构造函数中使用@Autowireding或setter,并在函数体中使用String.split()ing ?

class MyClass {
private List<String> myList;


@Autowired
public MyClass(@Value("${my.list.of.strings}") final String strs) {
myList = Arrays.asList(strs.split(","));
}


//or


@Autowired
public void setMyList(@Value("${my.list.of.strings}") final String strs) {
myList = Arrays.asList(strs.split(","));
}
}

我倾向于用这些方法中的一种来进行自动装配,以增强代码的可测试性。

通过在.properties文件中指定my.list.of.strings=ABC,CDE,EFG并使用

< p > @Value("${my.list.of.strings}") private String[] myString; < / p >

你可以得到字符串的数组。并且使用CollectionUtils.addAll(myList, myString),你可以得到字符串列表。

以上答案都正确。但是您可以在一行中实现这一点。 请尝试下面的声明,你会得到一个字符串列表中所有以逗号分隔的值

private @Value("#{T(java.util.Arrays).asList(projectProperties['my.list.of.strings'])}") List<String> myList;

您还需要在xml配置中定义以下行。

<util:properties id="projectProperties" location="/project.properties"/>

只需替换属性文件的路径和文件名。这样就可以开始了。:)

希望这对你有所帮助。欢呼。

使用Spring EL:

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

假设你的属性文件正确加载如下:

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

考虑使用公共配置。它有内置的功能,以打破一个条目在属性文件数组/列表。结合SpEL和@Value应该会给你想要的


按照要求,这是你需要的(没有真正尝试过代码,可能会有一些错误,请原谅我):

在Apache Commons Configuration中,有PropertiesConfiguration。它支持将分隔字符串转换为数组/列表的特性。

例如,如果您有一个属性文件

#Foo.properties
foo=bar1, bar2, bar3

用下面的代码:

PropertiesConfiguration config = new PropertiesConfiguration("Foo.properties");
String[] values = config.getStringArray("foo");

将给你一个字符串数组["bar1", "bar2", "bar3"]

要和Spring一起使用,在你的app context xml中有这个:

<bean id="fooConfig" class="org.apache.commons.configuration.PropertiesConfiguration">
<constructor-arg type="java.lang.String" value="classpath:/Foo.properties"/>
</bean>

在你的春豆里加入这个:

public class SomeBean {


@Value("fooConfig.getStringArray('foo')")
private String[] fooArray;
}

我相信这是可行的:P

您可以使用这样的注释来实现这一点

 @Value("#{T(java.util.Arrays).asList('${my.list.of.strings:a,b,c}')}")
private List<String> mylist;

这里my.list.of.strings将从属性文件中选择,如果它不在那里,那么将使用默认的a,b,c

在属性文件中,你可以有这样的东西

my.list.of.strings = d, e, f

注意值中的空格。我可能错了,但我认为逗号分隔列表中的空格不会使用@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".

如果使用属性占位符,则ser1702544示例将变成

@Value("#{myConfigProperties['myproperty'].trim().replaceAll(\"\\s*(?=,)|(?<=,)\\s*\", \"\").split(',')}")

使用占位符xml:

<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="properties" ref="myConfigProperties" />
<property name="placeholderPrefix"><value>$myConfigProperties{</value></property>
</bean>


<bean id="myConfigProperties" class="org.springframework.beans.factory.config.PropertiesFactoryBean">
<property name="locations">
<list>
<value>classpath:myprops.properties</value>
</list>
</property>
</bean>

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

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

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

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

激活新的配置服务,该服务支持将String转换为Collection类型。 如果您不激活这个配置服务,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的系统

如果你正在阅读这篇文章,并且你正在使用春天的引导,你还有一个选项可以使用这个功能

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

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

使用春天的引导,你可以这样写它(索引从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

我认为这对于获取数组和剥离空格更简单:

@Value("#{'${my.array}'.replace(' ', '').split(',')}")
private List<String> array;

如果你使用的是最新的Spring框架版本(我相信是Spring 3.1+),你不需要在SpringEL中进行字符串分割,

简单地添加PropertySourcesPlaceholderConfigurer和DefaultConversionService在你的Spring的配置类(一个与配置注释),例如:

@Configuration
public class AppConfiguration {


@Bean
public static PropertySourcesPlaceholderConfigurer propertyPlaceholderConfigurer() {
return new PropertySourcesPlaceholderConfigurer();
}


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

在你的课堂上

@Value("${list}")
private List<String> list;

在属性文件中

list=A,B,C,D,E

如果没有DefaultConversionService,当您将值注入字段时,您只能将逗号分隔的字符串放入字符串数组中,但是DefaultConversionService为您做了一些方便的魔术,并将它们添加到Collection, array等(如果您想了解更多,请检查实现)。

有了这两个,它甚至可以处理包括换行符在内的所有多余的空白,因此您不需要添加额外的逻辑来修剪它们。

如果您正在使用Spring Boot 2,那么它就可以正常工作,不需要任何额外的配置。

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


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

在我的情况下,一个整数列表的工作:

@Value("#{${my.list.of.integers}}")
private List<Integer> listOfIntegers;

属性文件:

my.list.of.integers={100,200,300,400,999}

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

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

和使用

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

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

我使用Spring Boot 2.2.6

我的属性文件:

usa.big.banks= JP Morgan, Wells Fargo, Citigroup, Morgan Stanley, Goldman Sachs

我的代码:

@Value("${usa.big.banks}")
private List<String> bigBanks;


@RequestMapping("/bigbanks")
public String getBanks() {
System.out.println("bigBanks = " + bigBanks);
return bigBanks.toString();
}

它运行正常

这个问题的答案

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

对于逗号分隔的值正常工作。 要处理null(当属性未指定时),将默认值(__abc0在属性名之后)添加为空字符串,如下所示

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