使用Spring属性占位符从文件.properties中读取列表

Lic*_*ici 13 spring properties

我想使用Spring属性占位符填充bean列表属性.

上下文文件

<bean name="XXX" class="XX.YY.Z">
      <property name="urlList">
            <value>${prop.list}</value>
      </property>
</bean>
Run Code Online (Sandbox Code Playgroud)

属性文件

prop.list.one=foo
prop.list.two=bar
Run Code Online (Sandbox Code Playgroud)

任何帮助将非常感激

Chs*_*y76 12

使用util:properties元素加载属性.您可以使用PropertyPlaceholderConfigurer指定文件的路径:

<bean name="XXX" class="XX.YY.Z">
  <property name="urlList">
    <util:properties location="${path.to.properties.file}"/>
  </property>
</bean>
Run Code Online (Sandbox Code Playgroud)

更新我误解了这个问题; 您只想返回键以特定字符串开头的属性.实现这一目标的最简单方法是在bean的setter方法中实现.您必须将字符串作为单独的属性传递给您的bean.扩展上述声明:

<bean name="XXX" class="XX.YY.Z" init-method="init">
  <property name="propertiesHolder">
     <!-- not sure if location has to be customizable here; set it directly if needed -->
    <util:properties location="${path.to.properties.file}"/>
  </property>
  <property name="propertyFilter" value="${property.filter}" />
</bean>
Run Code Online (Sandbox Code Playgroud)

在你的XX.YY.Zbean中:

private String propertyFilter;
private Properties propertiesHolder;
private List<String> urlList;

// add setter methods for propertyFilter / propertiesHolder

// initialization callback
public void init() {
  urlList = new ArrayList<String>();
  for (Enumeration en = this.propertiesHolder.keys(); en.hasMoreElements(); ) {
    String key = (String) en.nextElement();
    if (key.startsWith(this.propertyFilter + ".") { // or whatever condition you want to check
      this.urlList.add(this.propertiesHolder.getProperty(key));
    }
  } // for
}
Run Code Online (Sandbox Code Playgroud)

如果需要在许多不同的地方执行此操作,可以将上述功能包装到FactoryBean中.


小智 10

更简单的解决方案:

class Z {
    private List<String> urlList;
    // add setters and getters
}
Run Code Online (Sandbox Code Playgroud)

你的bean定义

<bean name="XXX" class="XX.YY.Z">
      <property name="urlList" value="#{'${prop.list}'.split(',')}"/>
</bean>
Run Code Online (Sandbox Code Playgroud)

然后在你的属性文件中:

prop.list=a,b,c,d
Run Code Online (Sandbox Code Playgroud)


bui*_*ire 5

<bean id="cpaContextSource" class="org.springframework.ldap.core.support.LdapContextSource">
    <property name="urls">
    <bean class="org.springframework.util.CollectionUtils" factory-method="arrayToList">
        <constructor-arg type="java.lang.Object">
            <bean class="org.springframework.util.StringUtils" factory-method="tokenizeToStringArray">
                <constructor-arg type="java.lang.String" value="${myList}"/>
                <constructor-arg type="java.lang.String" value=" "/>
            </bean>
        </constructor-arg>
    </bean>
    </property>
Run Code Online (Sandbox Code Playgroud)

哪里:

myList=http://aaa http://bbb http://ccc
Run Code Online (Sandbox Code Playgroud)