【问题标题】:Does Spring supports nested SpEL expressions?Spring 是否支持嵌套的 SpEL 表达式?
【发布时间】:2017-02-12 12:01:42
【问题描述】:

这是我的属性文件:

base1.jdbc.password=pass1 base2.jdbc.password=pass2 base3.jdbc.password=pass3.

我有一个名为 %DATABASE% 的环境变量,它可以是 base1base2base3

如何读取存储在环境变量中的数据库的密码属性?我想到了类似的东西:

<property name="password" value="${#{systemProperties['DATABASE']}.jdbc.password}"/>

但不确定是否正确。

【问题讨论】:

  • 看起来不错。什么是错误、问题或问题?
  • 我试过了,但我得到了java.lang.IllegalArgumentException: Could not resolve placeholder '#{systemProperties['DATABASE']}.jdbc.password' in string value "${#{systemProperties['DATABASE']}.jdbc.password}"

标签: java spring


【解决方案1】:

在您的应用程序上下文 xml 中使用以下配置

<bean 
    class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="location">
        <value>##YOUR PROPERTIES FILE NAME###</value>
    </property>
</bean>

您可以从相关问题 (How do you configure a Spring bean container to load a Java property file?) 中获取详细信息

这里给出PropertyPlaceholderConfigurer的描述(http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/beans/factory/config/PropertyPlaceholderConfigurer.html)

使用您在&lt;value&gt; 标记中拥有的属性文件的名称

以下是我如何在示例项目中使用属性的示例。我有一个名为 processRetryPolicy 的 bean,其属性是从属性文件中加载的。

<bean id='processRetryPolicy' class='com.poc.process.model.ProcessRetryPolicy' >
    <property name="isActive" value="${process.executor.conn.retry.policy.isActive}"/>
    <property name="intervalType" value="${process.executor.conn.retry.interval.type}"/>
    <property name="intervalvalue" value="${process.executor.conn.retry.interval.value}"/>
    <property name="retryPolicy" value="${process.executor.conn.retry.default.policy}"/>
</bean> 

属性在属性文件中定义为

process.executor.conn.retry.policy.isActive = true
process.executor.conn.retry.interval.type = HOUR
process.executor.conn.retry.interval.value = 1
process.executor.conn.retry.default.policy = Retry

要添加我在其中一个 spring 批处理应用程序中使用的环境属性:-

<property name="environment" value="#{jobParameters['env.type']}"/>

环境类型作为运行时参数传递如下

java -Xmx12288m -D<<List of Params and Values>> env.type=$env 

在 spring 核心中的另一种方法是使用 spring 表达式语言 (http://docs.spring.io/spring/docs/3.0.x/spring-framework-reference/html/expressions.html)

你的表情看起来正确。

【讨论】:

  • 您好 Amal,感谢您的回复,但请仔细阅读我的问题,我认为您没有明白。
  • @oualidqannouf 我的错!我误解了你的问题。无论如何,我已经添加了表达式语言的详细信息,并且您在问题中的表达看起来是正确的。这些信息可能与问题不完全相关,但我不会删除答案,因为它可能对其他人有帮助。
【解决方案2】:

添加属性占位符

<bean id="propertyPlaceholderConfigurer"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
 <property name="locations">
 <list>
 <value>classpath:xxxxx.properties</value>
 </list>
 </property>
</bean>

然后

<bean id="bean" class="xxx.class">
 <property name="password" value="#{systemProperties['DATABASE']}.jdbc.password"/>     
</bean>

【讨论】:

    猜你喜欢
    • 2014-07-03
    • 2017-09-23
    • 1970-01-01
    • 2011-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多