1

我想从 WEB.XML 中删除 env-entry

<env-entry>
    <description>String used in masking process</description>
    <env-entry-name>default_mask</env-entry-name>
    <env-entry-value>*</env-entry-value>
    <env-entry-type>java.lang.String</env-entry-type>
</env-entry>

所以我创建了一个具有 (c:/my.properties) 的属性文件

default_mask=9999   

所以我尝试使用现有的解决方案,如 JndiPropertyPlaceholderConfigurer (来自Spring Jndi Context 和 PropertyPlaceholderConfigurer )并在spring的 applicationcontext.xml 中配置为

<bean  
class="com.test.webappl.JndiPropertyPlaceholderConfigurer">  
<property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE"/> 
<property name="ignoreResourceNotFound" value="true"/> 
<property name="location" value="file:c:\my.properties"/>  

启动 Tomcat 服务器读取属性文件,如

.......com.test.webappl.JndiPropertyPlaceholderConfigurer] Loading properties file from URL [file:c:/my.properties]

当我阅读时,现在在java中

Context context = new InitialContext(); 
String resource = context.lookup("java:comp/env/default_mask");  

应用程序抛出以下错误

**javax.naming.NameNotFoundException: Name default_mask is not bound in this Context**

我在 web.xml 中的 spring 设置也是

<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:applicationcontext.xml</param-value>
</context-param>

有人知道我是否使用正确的方法吗?我知道这已经在Spring Jndi Context 和 PropertyPlaceholderConfigurer中得到了回答,但不知何故不适用于我的情况

提前致谢

4

2 回答 2

0

如果您将任何内容部署到任何应用程序服务器,最好将所有相关资源打包到部署单元(在您的情况下为战争)。

要回答您的问题 - 如果您使用 spring 向 JNDI 容器注入任何内容,您还应该让 spring 为您定位所有内容。

所以你不能使用

new InitialContext(); // this has nothing to do with spring.

希望这可以帮助 :)

于 2012-04-25T14:19:57.403 回答
0

您正在尝试(或期望)做的是“将名称值对从您的my.properties到 JNDI 上下文绑定”。

您提到的示例并没有这样做。只是做以下事情

  1. 如果上下文文件中引用了一个属性占位符(如${my.name}),那么它将从 JNDI 中解析它(假设它已经存在)
  2. 如果 JNDI 不提供它,则将其解析为从属性文件中读取的一些默认值。
  3. 没有关于将变量绑定到 JNDI 的详细信息。方法没有参考bind()

现在, 为了解决您的问题,即获取某种读取属性文件并将其绑定到 JNDI 树的方法,一种方法如下

  1. 您可以创建一个类JndiPropertyBinder并注入jndiTemplate其中。
  2. 在此类中注入您的属性文件
  3. 现在在 bean 上编写一个init 钩子,它将读取文件中的所有属性并将它们绑定到 jndi 树。
  4. 使这个 bean 尽早加载,以便在所有其他使用它的 bean 之前加载它。
于 2012-04-25T14:32:17.903 回答