Java 将jndi变量公开为属性占位符

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" /> 我可以将变量设

我有一个包含spring配置的jar。我正在检索一些JNDI变量来配置jar中的web服务地址。现在,我在Spring批处理中使用相同的jar,我想使用相同的Spring配置文件

我的问题是,我将web服务地址作为系统属性传递给批处理

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

  • ServletContext初始化参数
  • ServletContext上下文参数
  • JndiPropertySource
  • 系统属性
  • 系统环境
  • 对于(非web)属性,请按以下顺序查阅
    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个文件,但没有将“”放在第二个文件中。加上这个可以解决我的问题。非常感谢你!