【问题标题】:Spring Property Placeholders with String Concatenation带有字符串连接的 Spring 属性占位符
【发布时间】:2013-03-23 14:24:25
【问题描述】:

我的问题看起来很简单,但我无法解决。我有一个属性文件,其中包含所有环境(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

【问题讨论】:

    标签: java spring properties


    【解决方案1】:

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

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

    地点:

    服务器 = http://domain.host.com

    端口 = 7777

    端点 = /services/myservice

    结果是:

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

    【讨论】:

      【解决方案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 
      

      【讨论】:

      • 我不能使用环境变量/JVM属性,这是一个策略约束。
      【解决方案3】:

      我通过将 PropertyPlaceholderConfigurer bean 更改为 Properties 解决了这个问题。 &lt;util:properties/&gt; 可在 SpEL 中访问。

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

      host 是一个字符串 bean。

      【讨论】:

      • 介意分享您的 XML 吗?我想做同样的事情,但不确定您通过将其更改为属性所提到的内容...
      猜你喜欢
      • 1970-01-01
      • 2014-07-16
      • 2013-01-03
      • 2011-12-10
      • 1970-01-01
      • 2016-02-22
      • 1970-01-01
      • 1970-01-01
      • 2013-05-05
      相关资源
      最近更新 更多