如何在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
相关产品推荐
相关产品推荐

