【问题标题】:Can I default a system property for a constructor-arg in a spring config file?我可以在 spring 配置文件中为构造函数参数默认系统属性吗?
【发布时间】:2012-03-15 05:25:20
【问题描述】:

我有一个 spring 配置文件,其中包含以下元素:

<context:property-placeholder location="classpath:default.properties"/>

<bean id="theVar" class="java.lang.String">
    <constructor-arg value="${varName}"/>
</bean>

“varName”现在从属性文件移动到系统属性。它是在我开始 Maven 构建时添加的:

mvn clean install -DvarName=data

我还想在不指定 varName 的情况下运行我的构建:

mvn clean install

有什么方法可以在我的 spring 配置中默认 varName 吗?虽然这不起作用,但我正在寻找的概念示例是:

<bean id="theVar" class="java.lang.String">
    <constructor-arg value="${varName}" default="theDefaultValue"/>
</bean>

【问题讨论】:

  • 它需要是系统属性吗?可以在另一个文件中指定吗?
  • 它需要在构建时是动态的。我对如何提出建议持开放态度。我需要在调用构建时为 varName 指定不同的值,并且我还需要在不指定 varName 的情况下调用构建。
  • 指定多个属性文件有帮助吗? location 元素支持以逗号(,) 分隔的多个文件。您可以指定另一个包含“系统默认值”的文件,如果 classpath:default.properties 无法解析它,那么它将尝试由下一个属性文件解析。
  • 我在其他配置中这样做。这种情况下的问题是,它将处理变化的责任转移到了另一个系统,然后该系统必须管理文件。然后我必须找到一种在任何构建之前更新文件的方法。在我的本地开发机器上很容易做到,但在 CI 构建服务器上更难。使用系统属性在 CI 构建机器上处理这种变化很容易。
  • 看起来“systemPropertiesMode”可能有效。看着它。

标签: spring maven constructor properties


【解决方案1】:

原来在spring v2.5+中,如果定义了系统属性,可以用它来代替属性文件中定义的属性。您只需要确保使用相同的名称并启用“覆盖”选项。

例如,给定:

<!-- my spring config file -->
<context:property-placeholder location="classpath:default.properties" system-properties-mode="OVERRIDE"/>

还有:

# default.properties file
theVariable=One

当我执行时:

mvn clean install

为变量选择“一个”。如果我执行:

mvn clean install -DtheVariable=Two

取而代之的是“二”。

【讨论】:

    【解决方案2】:

    我不确定这是否会有所帮助,但如果您正在注释类并在系统属性不存在时想要一个默认值,这就是我目前所做的:

    @Value("#{systemProperties['fee.cc']?:'0.0225'}")
    public void setCcFeePercentage(BigDecimal ccFeePercentage) {
        this.setCcFeePercentage(ccFeePercentage);
    }
    

    【讨论】:

      【解决方案3】:

      Spring 3.0.x 支持这样的语法:

      value="${varName:defaultValue}"
      

      参考文献:

      【讨论】:

        【解决方案4】:

        可以按照@sebastien 描述的方式完成,但可以在配置文件中按照您的意愿进行:

        <bean id="theVar" class="java.lang.String">
            <constructor-arg value="#{systemProperties['varName'] == null ? 'default_value' : systemProperties['varName']}"/>
        </bean>
        

        如果您的varName 变量不存在,将设置默认值。

        【讨论】:

          猜你喜欢
          • 2016-08-22
          • 2015-04-20
          • 1970-01-01
          • 1970-01-01
          • 2012-06-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-09-14
          相关资源
          最近更新 更多