从属性文件中读取一个List,并用Spring注解@Value加载
类似于这个问题: http : //forum.springsource.org/showthread.php?111992-Loading-a-list-from-properties-file-using-Value-annotation (对此没有答复)
我想在.properties文件中有一个值列表,例如:
my.list.of.strings=ABC,CDE,EFG
并直接将其加载到我的课程中,即:
@Value("${my.list.of.strings}") private List<String> myList;
据我所知,这样做的另一种方法是在春季configuration文件,并加载它作为一个bean引用(纠正我,如果我错了),即
<bean name="list"> <list> <value>ABC</value> <value>CDE</value> <value>EFG</value> </list> </bean>
但有没有办法做到这一点? 使用.properties文件? ps:如果可能的话,我想用这个自定义代码来做这个。
使用Spring EL:
@Value("#{'${my.list.of.strings}'.split(',')}") private List<String> myList;
假设您的属性文件使用以下方法正确加载:
my.list.of.strings=ABC,CDE,EFG
从Spring 3.0开始,你可以添加一行
<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean" />
到你的applicationContext.xml
(或你configuration的东西)。 正如Dmitry Chornyi在评论中指出的那样,基于Java的configuration看起来像:
@Bean public ConversionService conversionService() { return new DefaultConversionService(); }
这将激活支持将String
转换为Collection
types的新configuration服务。 如果你没有激活这个configuration服务,那么Spring会回到它的遗留属性编辑器,作为configuration服务,它不支持这种转换。
转换为其他types的作品也是如此:
@Value("${my.list.of.ints}") private List<Integer> myList
将像一条线一起工作
my.list.of.ints= 1, 2, 3, 4
没有空白的问题, ConversionServiceFactoryBean
照顾它。
在Spring应用程序中,通常为每个Spring容器(或ApplicationContext)configuration一个ConversionService实例。 该转换服务将被Spring拿起,然后在框架需要执行types转换时使用。 […]如果没有使用Spring注册ConversionService,则使用原始的基于PropertyEditor的系统。
你认为@Autowired
构造函数或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(",")); } }
我倾向于使用这些方法之一来进行自动assembly,以增强我的代码的可testing性。
通过在.properties文件中指定my.list.of.strings=ABC,CDE,EFG
并使用
@Value("${my.list.of.strings}")
private String[] myString;
你可以得到string的数组。 并使用CollectionUtils.addAll(myList, myString)
,您可以获取string列表。
以上所有答案都是正确的。 但是你可以在一行中实现这一点。 请尝试下面的声明,你会得到一个string列表中的所有逗号分隔值。
private @Value("#{T(java.util.Arrays).asList(projectProperties['my.list.of.strings'])}") List<String> myList;
还需要在xmlconfiguration中定义以下行。
<util:properties id="projectProperties" location="/project.properties"/>
只需要replace你的属性文件的path和文件名。 你很好走。 🙂
希望这可以帮助你。 干杯。
你可以用这样的注释来做到这一点
@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
考虑使用Commonsconfiguration。 它内置的function可以将属性文件中的条目分割为数组/列表。 与SpEL和@Value精梳应该给你想要的
根据要求,这里是你需要的(没有真正尝试过的代码,可能会有一些错误,请耐心等待):
在Apache Commons Configuration中,有PropertiesConfiguration。 它支持将分隔string转换为数组/列表的function。
例如,如果你有一个属性文件
#Foo.properties foo=bar1, bar2, bar3
用下面的代码:
PropertiesConfiguration config = new PropertiesConfiguration("Foo.properties"); String[] values = config.getStringArray("foo");
会给你一个["bar1", "bar2", "bar3"]
的string数组
要使用Spring,请在您的应用上下文中使用xml:
<bean id="fooConfig" class="org.apache.commons.configuration.PropertiesConfiguration"> <constructor-arg type="java.lang.String" value="classpath:/Foo.properties"/> </bean>
并在你的spring豆有这个:
public class SomeBean { @Value("fooConfig.getStringArray('foo')") private String[] fooArray; }
我相信这应该工作:P
小心值中的空格。 我可能是错的,但我认为逗号分隔列表中的空格不会被@Value和Spel截断。 列表
foobar=a, b, c
将作为string列表读入
"a", " b", " c"
在大多数情况下,你可能不想要的空间!
expression方式
@Value("#{'${foobar}'.trim().replaceAll(\"\\s*(?=,)|(?<=,)\\s*\", \"\").split(',')}") private List<String> foobarList;
会给你一个string列表:
"a", "b", "c".
正则expression式删除逗号前后的所有空格。 值中的空格不会被删除。 所以
foobar = AA, BB, CCC
应该导致价值
"AA", "BB", "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>