我有一个装有弹簧配置的罐子。我正在检索一些JNDI变量来配置jar中的Web服务地址。现在,我在Spring Batch中使用相同的jar,我想使用相同的spring配置文件。
我的问题是我使用
将Web服务地址作为系统属性传递给我的批处理java -DmyFoo=bar
使用此
<context:property-placeholder system-properties-mode="OVERRIDE" ignore-unresolvable="true" />
我可以将变量视为@Value(&#34; myFoo&#34;)
所以我的问题是:有没有办法在我的属性占位符中获取我的JNDI变量?或者能够将它们作为JNDI获取,然后将它们暴露在属性占位符中?
我想要做的就是替换这个
<bean id="MBean" class="com.xxx.utils.ActivationMBean">
<property name="makeCall">
<jee:jndi-lookup jndi-name="semantic.activation" />
</property>
</bean>
通过这个
<bean id="MBean" class="com.xxx.utils.ActivationMBean">
<property name="makeCall" value="${semantic.activation}" />
</bean>
答案 0 :(得分:3)
使用<context:property-placeholder />
时,PropertySourcesPlaceholderConfigurer
已注册。 (即当您使用的是Spring 3.1或更高版本,并且使用的是没有版本的xsd或版本> 3.0)。在Spring 3.1中添加了property-source abstraction。
PropertySourcesPlaceholderConfigurer
使用已配置的PropertySource
来获取占位符的值。 PropertySource
所咨询的@PropertySource
取决于环境,网络或非网络,以及location
元素的<context:property-placeholder />
属性中PropertySource
注释或加载的属性文件的数量。
对于StandardServletEnvironment
(网络),PropertySource
按以下顺序查阅。
对于StandardEnvironment
(非网络),localOverride
按以下顺序查阅。
取决于从属性文件加载的true
属性属性的设置被添加到{{1}列表的顶部(false
)或底部(PropertySource
)咨询。
给出以下bean定义。
<bean id="MBean" class="com.xxx.utils.ActivationMBean">
<property name="makeCall" value="${semantic.activation}" />
</bean>
在Web环境中,占位符${semantic.activation}
首先针对JNDI树resolved,如果找不到,它将回退到系统属性。对于非Web,不会尝试JNDI查找,并且会查询-D
或在环境中指定的属性。
答案 1 :(得分:0)
我终于找到了一个可以满足我需要的技巧:
<bean id="MBean" class="com.xxx.utils.ActivationMBean">
<property name="makeCall">
<jee:jndi-lookup jndi-name="semantic.activation" default-value="${semantic.activation}" />
</property>
</bean>
它不能与@Value注释一起使用,但是如果我们使用JNDI它将采用它而不是它将回退到属性。如果没有定义它将无法启动,这就是我想要的。