Java 将jndi变量公开为属性占位符
我有一个包含spring配置的jar。我正在检索一些JNDI变量来配置jar中的web服务地址。现在,我在Spring批处理中使用相同的jar,我想使用相同的Spring配置文件 我的问题是,我将web服务地址作为系统属性传递给批处理Java 将jndi变量公开为属性占位符,java,spring,jakarta-ee,spring-batch,Java,Spring,Jakarta Ee,Spring Batch,我有一个包含spring配置的jar。我正在检索一些JNDI变量来配置jar中的web服务地址。现在,我在Spring批处理中使用相同的jar,我想使用相同的Spring配置文件 我的问题是,我将web服务地址作为系统属性传递给批处理 java -DmyFoo=bar 用这个 <context:property-placeholder system-properties-mode="OVERRIDE" ignore-unresolvable="true" /> 我可以将变量设
java -DmyFoo=bar
用这个
<context:property-placeholder system-properties-mode="OVERRIDE" ignore-unresolvable="true" />
我可以将变量设置为@Value(“myFoo”)
所以我的问题是:有没有办法在我的属性占位符中获取我的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>
我终于找到了一个可以满足我需要的技巧:
<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,它将接受它,而不是返回到属性。如果没有定义,它将无法启动,这正是我想要的。当使用时,
a已注册。(也就是说,您使用的是Spring3.1或更高版本,并且使用的xsd没有版本或版本>3.0)。在Spring 3.1中添加了
propertysourcesplaceplaceconfigurer
使用已配置的PropertySource
s来获取占位符的值。咨询的PropertySource
取决于环境、网络或非网络,以及@PropertySource
注释或通过
元素的位置
属性加载的属性文件的数量
对于(web),请按以下顺序查阅PropertySource
s
PropertySource
s
localOverride
的设置,从属性文件加载的属性将添加到PropertySource
列表的顶部(true
)或底部(false
),以供参考
给定以下bean定义
<bean id="MBean" class="com.xxx.utils.ActivationMBean">
<property name="makeCall" value="${semantic.activation}" />
</bean>
在web环境中,占位符
${semantic.activation}
位于JNDI树的第一个位置,如果找不到占位符,它将返回到系统属性。对于非web,不尝试JNDI查找,并查阅由-D
或环境中指定的属性。请改用属性资源占位符配置器。我强烈建议改为使用名称空间
。好吧,我在批处理中这样做了,但是我如何才能将JNDI作为${semantic.activation}?不确定我是否理解,但是语义。激活是使用JndiPropertySource
解决的(除其他外)。因此,假设您使用的是PropertySourceSplaceHolderConfigure
,那么它已经被查找到了。所以基本上你的替代品应该已经可以用了,不需要任何额外的努力。确保您使用的是版本较少的spring context.xsd
或至少是版本3.0,否则您仍然会得到PropertyPlaceHolderConfigurer
。服务器端我有一个问题:我需要做什么,这样它也会在JNDI中查找?我在spring 3.2.8中使用的是版本较少的spring-context.xsd。如前所述,它将使用JndiPropertySource
在JNDI中进行查找。它将查找java:comp/env/semantic.activation
。如果希望它失败,请不要设置忽略无法解析的占位符
,也不要将属性添加到属性文件中。然后它将失败。这也是属性资源占位符配置器通过咨询jndPropertySource
所做的。你正在走向复杂。正如我试图解释的那样,这是自引入PropertySource
s以来的默认行为。是的,将查找java:comp/env/semantic.activation变量。但是,在我没有JNDI服务的批处理中如何使用它呢?这就是为什么我需要用java-Dsemantic.activation系统属性填充默认值。感谢您帮助我解决此问题的决心!我缺少的是,我使用了2个文件,但没有将“”放在第二个文件中。加上这个可以解决我的问题。非常感谢你!