You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Tomcat中配置java.util.Properties作为JNDI资源?附Jetty示例

嘿,我来帮你搞定Tomcat里配置JNDI形式的java.util.Properties资源的问题!对比你给出的Jetty配置,Tomcat这边有两种常用方案,刚好对应你的两个疑问:

1. 直接配置硬编码键值对为JNDI Properties资源

和Jetty直接嵌套创建Properties对象的方式不同,Tomcat需要通过指定Bean工厂类来实现键值对的注入。你可以在Tomcat的context.xml里配置——如果要全局生效就修改conf/context.xml,如果只是单个项目使用,就放在项目的META-INF/context.xml里:

<Resource name="props/users" 
          auth="Container"
          type="java.util.Properties"
          factory="org.apache.naming.factory.BeanFactory">
  <Parameter name="url" value="http://127.0.0.1:5984" />
  <Parameter name="schema" value="users" />
  <Parameter name="user" value="mary" />
  <Parameter name="password" value="..." />
</Resource>

这里几个关键点要注意:

  • factory必须指定org.apache.naming.factory.BeanFactory,它负责把<Parameter>里的键值对注入到java.util.Properties对象中
  • name就是后续JNDI lookup要用到的名称,和Jetty里的<Arg>props/users</Arg>对应
  • 代码中获取资源的方式和Jetty类似:
Context initCtx = new InitialContext();
Context envCtx = (Context) initCtx.lookup("java:comp/env");
Properties props = (Properties) envCtx.lookup("props/users");
2. 加载外部properties文件作为JNDI资源

如果你的配置已经写在单独的.properties文件里(比如/opt/tomcat/config/users.properties),可以通过自定义工厂类来实现加载,步骤如下:

第一步:编写简单的JNDI工厂类

这个类负责根据配置的文件路径加载Properties:

import javax.naming.Context;
import javax.naming.Name;
import javax.naming.RefAddr;
import javax.naming.Reference;
import javax.naming.spi.ObjectFactory;
import java.io.FileInputStream;
import java.util.Hashtable;
import java.util.Properties;

public class PropertiesResourceFactory implements ObjectFactory {
    @Override
    public Object getObjectInstance(Object obj, Name name, Context nameCtx, Hashtable<?, ?> environment) throws Exception {
        Reference ref = (Reference) obj;
        RefAddr filePathRef = ref.get("filePath");
        String filePath = filePathRef.getContent().toString();
        
        Properties props = new Properties();
        try (FileInputStream fis = new FileInputStream(filePath)) {
            props.load(fis);
        }
        return props;
    }
}

把这个类打包成jar,放到Tomcat的lib目录(全局生效)或者项目的WEB-INF/lib目录(仅当前项目生效)。

第二步:在context.xml里配置资源

<Resource name="props/users" 
          auth="Container"
          type="java.util.Properties"
          factory="com.yourpackage.PropertiesResourceFactory"
          filePath="/opt/tomcat/config/users.properties" />

配置完成后,你就可以用和第一种方式完全一样的JNDI lookup代码获取到加载好的Properties对象了。


内容的提问来源于stack exchange,提问作者Alisson Gomes

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 08:29:51