具有字符串连接的Spring属性占位符

时间:2013-04-02 10:19:09

标签: java spring properties

我的问题看起来很简单,但我无法解决它。我有一个属性文件,其中包含所有环境(dev,qa,prod)的配置详细信息。

示例config.properties

dev.maxLength=2000  
qa.maxLength=4000

我们有一个父属性文件,其中包含主机名,环境映射。

示例hosts.properties

host1=dev
host2=qa

属性名称host1存储在bean hostname中。

<bean id="hostname"
  factory-bean="localhostInetAddress"
  factory-method="getHostName"/> 

要解析配置属性名称,我必须按如下方式加入字符串, ${${**hostname**}.maxLength}应解析为${dev.maxLength}

我尝试使用SpEL但没有成功。我得到Could not resolve placeholder例外。如何在属性占位符中连接bean值?如何构建动态属性名称?

春季版3.2

3 个答案:

答案 0 :(得分:14)

要连接从Spring属性占位符解析的值,您需要使用单个quoutes('')转义它们的值,并使用#{}通过SpEL表达式包装占位符表达式。

<bean id="myService" class=""com.services.MyService">
  ...
  <property name="endpointAddress" value="#{'${server}' + ':' + '${port}' + '${endpoint}'}" />
</bean>

其中:

  

server = http://domain.host.com

     

port = 7777

     

endpoint = / services / myservice

结果将是:

  

http://domain.host.com:7777/services/myservice

答案 1 :(得分:2)

最好在自己的文件中使用特定于环境的属性并使用Spring Profiles。 例如,我有四个仅用于db配置的xml文件,local.db.xml,dev.db.xml,qa.db.xml和prod.db.xml。 在每个db.xml中,我将配置文件设置为适当的值。

我的local.db.xml有

<beans profile="db.local" .. >

为了启动Tomcat,我按如下方式指定VM选项

-Dspring.profiles.active=db.local 

答案 2 :(得分:2)

我通过将PropertyPlaceholderConfigurer bean更改为Properties来解决了这个问题。 可以在SpEL中访问<util:properties/>

实施例: "#{prop[host+'.'+'maxLength']}"

其中host是一个字符串bean。