将jndi变量公开为财产占有者

时间:2014-10-01 11:47:14

标签: java spring java-ee spring-batch

我有一个装有弹簧配置的罐子。我正在检索一些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>

2 个答案:

答案 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按以下顺序查阅。

  1. ServletContext init-params
  2. ServletContext context-params
  3. JndiPropertySource
  4. 系统属性
  5. 系统环境
  6. 对于StandardEnvironment(非网络),localOverride按以下顺序查阅。

    1. 系统属性
    2. 系统环境
    3. 取决于从属性文件加载的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它将采用它而不是它将回退到属性。如果没有定义它将无法启动,这就是我想要的。